根据HTTP/1.1规范:
该
POST
方法用来请求原始服务器接受被附在请求由标识的资源的新下属实体Request-URI
的Request-Line
换句话说,POST
用于创建.
该
PUT
方法请求将所包含的实体存储在提供的实体下Request-URI
.如果Request-URI
引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本.如果Request-URI
未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.
也就是说,PUT
用于创建或更新.
那么,应该使用哪一个来创建资源?或者需要支持两者?
我在这里看到了几个问题,例如如何调试RESTful服务,其中提到:
不幸的是,相同的浏览器不允许我测试HTTP PUT,DELETE,甚至在某种程度上测试HTTP POST.
我也听说过浏览器只支持GET和POST,来自其他一些来源:
但是,Firefox中的一些快速测试显示发送PUT
和DELETE
请求按预期工作 - XMLHttpRequest
成功完成,并且请求以正确的方法显示在服务器日志中.我是否缺少某些方面,例如跨浏览器兼容性或非明显的限制?
我最近看到许多框架决定"伪造"PUT和DELETE请求.就像Ruby on Rails一样.他们似乎在等待浏览器赶上来.他们在等待是徒劳的吗?
这甚至可以在任何地方实施吗?
我尝试构建一个非常简单的网站,可以将数据添加到sqlite3数据库中.我有一个带有两个文本输入的POST表单.
index.html的:
{% if top_list %}
<ul>
<b><pre>Name Total steps</pre></b>
{% for t in top_list %}
<pre>{{t.name}} {{t.total_steps}}</pre>
{% endfor %}
</ul>
{% else %}
<p>No data available.</p>
{% endif %}
<br>
<form action="/steps_count/" method="post">
{% csrf_token %}
Name: <input type="text" name="Name" /><br />
Steps: <input type="text" name="Steps" /><br />
<input type="submit" value="Add" />
</form>
Run Code Online (Sandbox Code Playgroud)
forms.py:
from django import forms
from steps_count.models import Top_List
class Top_List_Form(forms.ModelForm):
class Meta:
model=Top_List
Run Code Online (Sandbox Code Playgroud)
views.py:
# Create your views here.
from django.template import Context, loader …
Run Code Online (Sandbox Code Playgroud) 我试图用上传在Django其余图像multipart/form-data
的PUT
要求和枕头:
class ABC(APIView):
parser_classes = (MultiPartParser,)
def put(self, request):
a = Image()
a.image_url = request.data["image"]
a.save()
class Image(models.Model):
image_url = models.ImageField(upload_to='static/bills', blank=True)
Run Code Online (Sandbox Code Playgroud)
我发出了一个请求,它是一个PUT请求和一个multipart/form-data.我最终得到的响应代码为400,并带有以下消息:
{
"detail": "Multipart form parse error - Invalid boundary in multipart: None"
}
Run Code Online (Sandbox Code Playgroud)
不知何故,这已经破裂了.我第一次写这篇文章时工作正常.从那时起,我为CORS请求添加了一些设置配置,例如:
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = (
'x-requested-with',
'content-type',
'accept',
'origin',
'authorization',
'x-csrftoken',
'token',
'x-device-id',
'x-device-type',
'x-push-id',
'dataserviceversion',
'maxdataserviceversion'
)
CORS_ALLOW_METHODS = (
'GET',
'POST',
'PUT',
'PATCH',
'DELETE',
'OPTIONS'
)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
选项请求响应:
Access-Control-Allow-Headers ? x-requested-with, content-type, accept, origin, authorization, x-csrftoken, …
Run Code Online (Sandbox Code Playgroud) 目前,我的部分应用程序会向用户发送电子邮件,提醒他们注意事件或任务.当点击一个MarkComplete在电子邮件客户端的链接,一个HTTP GET请求我做ActionHandler.ashx(一个HttpHandler),其中的查询字符串参数的输入,允许事件/任务的更新.然后将新的电子邮件发送回客户端信令完成.这有效.
这种HTTP GET对处理程序的不良副作用是启动浏览器(即此时,浏览器的打开是不必要的并且是令人讨厌的).
前提:当我研究ASP.Net Web Api时,我想我可能能够将HTTPHandler中的少量代码重构为Web API控制器中的PUT方法.我的理解是,在执行上述所需的处理之后,该控制器可以用无效返回(HTTP状态代码204)进行响应.
问题:Web API控制器中新编写的PUT方法中的上述方法是否会返回204,这是否会阻止浏览器完全启动?我希望最终用户点击他第一封电子邮件中的链接,只获得新构建的电子邮件信号"完成"(此处根本没有浏览器).
编辑澄清2016年5月22日:
当我从Google Chrome提交此表单时,浏览器会发出GET请求.从HTML表单提交的具有多部分/表单数据编码的HTTP PUT请求通常是不受支持的客户端吗?
<form id="#main-form" action="http://localhost:8080/resource/1" method="put"
enctype="multipart/form-data">
<input type="text" name="name"/>
<input type="submit" value="submit" />
</form>
Run Code Online (Sandbox Code Playgroud) 我对RESTful PHP上的教程/示例感到困惑.他们中的大多数都在使用框架(例如Slim)并最终成为API,这使我更加困惑.在完全理解如何创建简单的RESTful PHP之前,我想首先避免所有框架和API材料.
我明白那个,
REST,它的核心,就是为工作使用正确的HTTP动词.GET,POST,PUT,DELETE都有意义,如果某些内容被描述为RESTful,那么它真正意味着所涉及的网站/应用程序都遵循这些含义.
而从PHP服务器端,我明白这是怎么我能察觉的REST请求类型,
$_SERVER['REQUEST_METHOD']
Run Code Online (Sandbox Code Playgroud)
但我的主要问题是如何通过URL将这些REST类型(GET,POST,PUT,DELETE)发送到服务器?
例如,从本教程中,
当您希望创建或更新URL标识的资源时,将使用PUT请求.例如,
然后,
DELETE应该与PUT相反; 当您要删除请求的URL标识的资源时,应该使用它.
http://restfulphp.com/clients/robin
并且http://restfulphp.com/clients/anne
是相同的干净URL模式.我怎么知道前者是用于PUT而后者是用于DELETE?或者,在那里我应该在表格/ HTML设置来区分它们?
当curl进来时它会变得复杂 - 它与REST网站有什么关系?
从上面的教程,
Once you have cURL installed, type:
curl -v google.com
Run Code Online (Sandbox Code Playgroud)
我应该在哪里打字?
curl如何帮助我删除或PUT?如何$_SERVER['REQUEST_METHOD']
从curl中检测REST类型?
curl -v -X DELETE /clients/anne
Run Code Online (Sandbox Code Playgroud)
和
curl -v -X PUT -d "some text"
Run Code Online (Sandbox Code Playgroud)
我问的问题可能听起来很愚蠢,但如果有人能帮助我理解这些问题会很棒.
编辑:
Argg PHP cURL
- 另一件让我更加困惑的事情!如果我要通过XMLHttpRequest
对象发送REST请求类型,为什么还需要它?它似乎是为了与其他API提供程序进行通信,我希望在此阶段避免使用它们.
如果我可以PHP cURL …
我写了这个简单的程序:
@app.route('/puttest/', methods=['GET', 'PUT'])
def upload_file():
if request.method == 'PUT':
return 'Hello, {}!'.format(request.form['name'])
else:
return '''
<title>Does it work ?</title>
<h1>PUT test</h1>
<form action=http://localhost:8887/puttest/ method=put>
<input type=text name=name>
<input type=submit value=try>
</form>
'''
if __name__ == '__main__':
app.run('0.0.0.0', 8887)
Run Code Online (Sandbox Code Playgroud)
它适用于GET
方法,但它无法使用PUT
.尝试发送put
消息,我可以在浏览器中看到此错误:
Method Not Allowed
The method is not allowed for the requested URL.
Run Code Online (Sandbox Code Playgroud)
put
方法发生了什么?
如果我在程序中的任何地方改变put
方法,它将工作正常post
.
我尝试使用 ASP.NET Core 标签助手创建一个像这样的简单 HTML 表单:
<form asp-action="RemoveScheduledTenancyDeletion" method="put" asp-route-tenancyId="@Model.Tenancy.TenancyId">
<div class="form-group">
<input type="submit" value="Remove sheduled tenancy deletion" class="btn btn-default" />
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
在TenancyController
里面有一个简单的动作:
[HttpPut]
public async Task<IActionResult> RemoveScheduledTenancyDeletion(Guid tenancyId)
{
//some logic here
return RedirectToAction(nameof(List));
}
Run Code Online (Sandbox Code Playgroud)
似乎以某种方式将整个请求转化为HttpGet
动作。任何想法可能是错误的?
超出范围,我有一个单独的 REST API,其中定义了此类操作,HttpPut
并且它可以与 Angular 和其他与 API 通信的客户端应用程序正常工作,因此我看不出有任何理由不应该将其HttpPut
用作在 ASP.NET Core MVC 应用程序中很好。我错过了什么吗?干杯
在我的 laravel 5.7 应用程序中,我制作了用于更新数据的表单,例如:
<section class="card-body">
<h4 class="card-title">Edit vote</h4>
<form method="PUT" action="{{ url('/admin/votes/update/'.$vote->id) }}" accept-charset="UTF-8" id="form_vote_edit" class="form-horizontal"
enctype="multipart/form-data">
{!! csrf_field() !!}
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
Run Code Online (Sandbox Code Playgroud)
在routes/web.php中用餐的路线:
Route::group(['middleware' => ['auth', 'isVerified', 'CheckUserStatus'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
...
Route::put('/votes/update/{vote_id}', 'Admin\VotesController@update');
Run Code Online (Sandbox Code Playgroud)
但提交表格时我收到错误请求:
Request URL: http://local-votes.com/admin/votes/update/22?_token=0CEQg05W4jLWtpF3xB6BGSdz1icwysiDOStLVgHv&id=22&name=gg...
Request Method: GET
Status Code: 405 Method Not Allowed
Run Code Online (Sandbox Code Playgroud)
为什么 GET 请求,我的表单有什么问题?
谢谢!