背景信息分析:

根据 RFC 2616,第 9.5 条,POST 用于创建资源:

使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。

根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:

PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。

我的问题:

那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?


当前回答

使用 POST 创建,而 PUT 更新,这就是 Ruby on Rails 如何做到这一点。

PUT    /items/1      #=> update
POST   /items        #=> create

其他回答

使用 POST 创建,而 PUT 更新,这就是 Ruby on Rails 如何做到这一点。

PUT    /items/1      #=> update
POST   /items        #=> create

在恢复已经提到的风险下,似乎很重要的是要记住,PUT意味着客户端在创建资源时会控制什么URL。因此,PUT和POST之间的选择的一部分将是关于您可以信任客户端提供正确的,正常的URL,与您的URL计划是什么相一致。

当您无法完全信任客户端做正确的事情时,更适合使用 POST 创建一个新的项目,然后将 URL 返回客户端在回复中。

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 请求。

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相匹配。

Ruby on Rails 4.0 将使用“PATCH”方法而不是 PUT 进行部分更新。

RFC 5789 讲述了 PATCH (自 1995 年以来):

一个新的方法是必要的,以改善互动性和防止错误. PUT 方法已经定义,以重新编写一个资源与一个完整的新体,并且不能重新使用,以进行部分变更。 否则, proxies 和 cache,甚至客户端和服务器,可能会被混淆的结果操作。 POST 已经使用,但没有广泛的互动性(

“Edge Rails: PATCH 是更新的新主要 HTTP 方法,”它解释。