作者:kikokikolove | 2023-08-27 13:25
我想知道人们对RESTful PUT
操作的看法是什么,它在响应体中没有返回任何内容(null).
1> system PAUSE..:
HTTP规范(RFC 2616)有许多适用的建议.这是我的解释:
HTTP状态代码,200 OK
用于成功更新现有资源的PUT.不需要响应机构.(根据第9.6节,204 No Content
更合适.)
201 Created
用于新资源的成功PUT的HTTP状态代码,具有在Location头字段中返回的新资源的最特定URI以及在响应主体中回显的资源的任何其他相关URI和元数据.(RFC 2616第10.2.2节)
HTTP状态代码409 Conflict
用于PUT是不成功的,因为一3 次三方变形例中,与所尝试的更新,并在响应体中的当前资源之间的差异的列表.(RFC 2616第10.4.10节)
400 Bad Request
不成功的PUT的HTTP状态代码,在响应正文中使用自然语言文本(例如英语)来解释PUT失败的原因.(RFC 2616第10.4节)
@stian:这句话于2013年2月3日被删除.可能是因为有人在这里读到了这句话.;)https://developer.mozilla.org/en-US/docs/HTTP/HTTP_response_codes$compare?from=346227&to=351003
@stian有趣!这在Mozilla方面似乎相当冒昧,因为我在RFC 2616中找不到任何内容(特别是[10.2成功2xx]部分(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2) )和[10.2.1 200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1))明确排除使用'200`进行PUT,DELETE,或任何其他方法.我错过了什么?比如Mozilla成为W3和IETF的老大?;或者也许他们从未听说过Postel的稳健性原则.
@systemPAUSE很好的答案.一个小问题:如果你不打算将响应机构归还给成功的操作,我建议你专门使用204.一些客户端(例如jQuery Ajax)如果期望非零长度响应但是没有得到它会阻塞.您可以在[此问题]中查看此示例(http://stackoverflow.com/questions/20928929/jquery-ajax-call-executes-error-on-200/20929815).
PUT方法的语义是忽略资源所处的当前状态,因此,对于由于第三方修改而不成功的PUT返回409冲突仅在请求是有条件的情况下才有意义.
可能RFC2616已经更新,因为这已得到解答.在9.6中没有提到"与200相关的无响应体".实际上,与PUT相关的响应体完全没有被提及.它仅指出`如果现有资源被修改,则应该发送200(OK)或204(No Content)响应代码以指示请求的成功完成.
2> LiorH..:
与此处的大多数答案相反,我实际上认为PUT应该返回更新的资源(当然除了HTTP代码之外).
您希望将资源作为PUT操作的响应返回的原因是,当您向服务器发送资源表示时,服务器也可以对此资源应用一些处理,因此客户端想知道该资源是如何处理的看似请求成功完成后.(否则它将不得不发出另一个GET请求).
@Raedwald肯定是的.REST不要求在PUT上更新*whole*资源,尽管通常建议使用它.某些字段可能没有意义进行更新 - 例如,创建日期或上次修改日期可能不应包含在PUT正文中,但可能会因PUT而更改.话虽如此,我不同意LiorH PUT应该导致资源回归; 在PUT之后我需要GET才能获得更新的资源.
@Randolpho _REST不要求在PUT_上更新整个资源,这不应该是PATCH的情况吗?
@MarcoCiambrone是的,我同意并且我放弃了我之前的评论.我已经改变了我对REST和PUT的调整 - PUT应该始终是幂等的,不应该用于部分更新.除非支持PATCH,否则POST是唯一的选择,在这种情况下,PATCH可能是一个不错的选择.但是,PATCH是一个新动词,可能不受某些服务器端框架的支持.
"服务器也可以对此资源应用一些处理":我是新手这个.这真的是RESTful吗?
答案写在rfc7231之前,但[第4.3.4节](https://tools.ietf.org/html/rfc7231#section-4.3.4)明确指出“ PUT方法要求目标的状态资源创建或替换为请求消息有效负载中包含的表示形式所定义的状态”