背景信息分析:
根据 RFC 2616,第 9.5 条,POST 用于创建资源:
使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。
根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:
PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。
我的问题:
那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?
Ruby on Rails 4.0 将使用“PATCH”方法而不是 PUT 进行部分更新。
RFC 5789 讲述了 PATCH (自 1995 年以来):
一个新的方法是必要的,以改善互动性和防止错误. PUT 方法已经定义,以重新编写一个资源与一个完整的新体,并且不能重新使用,以进行部分变更。 否则, proxies 和 cache,甚至客户端和服务器,可能会被混淆的结果操作。 POST 已经使用,但没有广泛的互动性(
“Edge Rails: PATCH 是更新的新主要 HTTP 方法,”它解释。
PUT 是用于创建或替换客户端所知道的 URL 的资源。
因此: PUT 仅是 CREATE 的候选人,客户在创建资源之前已经知道 URL。 /blogs/nigel/entry/when_to_use_post_vs_put 因为标题被用作资源密钥
RFC 如下:
注意: PUT 主要用于更新资源(通过将其全部替换为资源),但最近出现了使用 PATCH 来更新现有资源的动作,因为 PUT 说明它取代了整个资源。
從 REST API 設計 - 資源模型 Prakash Subramaniam of Thoughtworks
这迫使API避免多个客户更新一个资源的国家过渡问题,并且更顺利地与事件来源和CQRS相匹配。
POST 和 PUT 之间的区别在于服务器如何解释统一资源识别器. 使用 POST, ury 识别服务器上的对象,可以处理所包含的数据. 使用 PUT, 另一方面, ury 识别一个对象,服务器应该放置数据. 虽然 POST ury 通常指示一个程序或脚本, PUT ury 通常是路径和名称 fo
作者建议我们使用PUT上传文件,而不是POST。
正确实施,GET、HEAD、PUT 和 DELETE 方法是无效的,但不是 POST 方法,因此,当你做两个 PUT 时,你会得到一个新的记录,当你做两个 POST 时,你会得到两个新的记录。
但是,请注意,HTML 表单仅支持 GET 和 POST 作为 HTTP 请求方法。
<form method="put"> 是无效的 HTML 并将被处理为, 即发送 GET 请求。
原始服务器可以使用此 URI 创建资源
所以你使用POST和可能,但不需要PUT为资源创建. 你不需要支持两者. 对于我来说,POST是完美的足够。
如您的引用所提到的,您使用 PUT 创建没有资源分配到 IRI,您希望创建一个资源无论如何. 例如, PUT /users/123/password 通常将旧密码替换为新密码,但您可以使用它创建一个密码,如果它已经不存在(例如,由新鲜注册的用户或通过恢复被禁止的用户)。
对于我来说,了解区别的关键是了解谁定义资源的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
| |
这里有很多很好的答案,下面有很好的细节,但这帮助了我到达这个点。