背景信息分析:
根据 RFC 2616,第 9.5 条,POST 用于创建资源:
使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。
根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:
PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。
我的问题:
那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?
在恢复已经提到的风险下,似乎很重要的是要记住,PUT意味着客户端在创建资源时会控制什么URL。因此,PUT和POST之间的选择的一部分将是关于您可以信任客户端提供正确的,正常的URL,与您的URL计划是什么相一致。
当您无法完全信任客户端做正确的事情时,更适合使用 POST 创建一个新的项目,然后将 URL 返回客户端在回复中。
总体:
PUT 和 POST 都可以用于创建。
你必须问“你在做什么?”来区分你应该使用什么,假设你正在设计一个API来提出问题,如果你想使用POST,那么你会这样做一个问题列表,如果你想使用PUT,那么你会这样做一个特定的问题。
你不需要支持PUT和POST。
一些考虑:
我写了以下,作为关于此问题的另一个答案的一部分:
POST: 用于修改和更新资源 POST / 问题/<existing_question> HTTP/1.1 主机: www.example.com/ 注意下列是错误: POST / 问题/<new_question> HTTP/1.1 主机: www.example.com/ 如果 URL 尚未创建,您不应该使用 POST 创建它,同时指定名称。
大多数时候,你会用它们如下:
POST a resource into a collection PUT a resource identified by collection/:id。
例如:
POST /items PUT /items/1234
请注意,POST在收藏中“创建”一个新的元素,而PUT在某个URL中“替换”一个元素,但使用PUT进行部分修改是一种非常常见的做法,也就是说,只使用它来更新现有资源,并仅修改体内所包含的字段(忽略其他字段)。
请记住,REST是一组条约和指导方针,以保持您的API简单。 如果您结束了一个复杂的工作周围,只需检查“RESTfull”框,那么您正在击败目的。
Ruby on Rails 4.0 将使用“PATCH”方法而不是 PUT 进行部分更新。
RFC 5789 讲述了 PATCH (自 1995 年以来):
一个新的方法是必要的,以改善互动性和防止错误. PUT 方法已经定义,以重新编写一个资源与一个完整的新体,并且不能重新使用,以进行部分变更。 否则, proxies 和 cache,甚至客户端和服务器,可能会被混淆的结果操作。 POST 已经使用,但没有广泛的互动性(
“Edge Rails: PATCH 是更新的新主要 HTTP 方法,”它解释。
对于我来说,了解区别的关键是了解谁定义资源的ID:
例子(与某些地址服务)
POST (sever creates new resource)
client server/addresses // NOTE: no ID in the request
| |
| --{POST address data}--> |
| |
| <--{201, created addresses/321} | // NOTE: resource ID in the reply
| |
PUT (sever sets data of resource, creating it if necessary)
client server/addresses/321 // NOTE: *you* put the ID here!
| |
| --{PUT address data (to 321)}-->|
| |
| <--{201, created } | // NOTE: resource ID not required here
| |
这里有很多很好的答案,下面有很好的细节,但这帮助了我到达这个点。