背景信息分析:

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

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

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

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

我的问题:

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


当前回答

POST 意思是“创建新”如在“这里是创建用户的输入,为我创建它”。

PUT 的意思是“输入,如果已经存在,取代”如“这里是用户数据5”。

您 POST 到 example.com/users 因为您还不知道用户的 URL,您希望服务器创建它。

您可以访问 example.com/users/id 因为您想要更换/创建一个特定的用户。

与相同数据两次发布意味着创建两个相同的用户与不同的ID。 与相同数据两次发布会创建用户的第一个,并更新到相同状态的第二次(没有变化)。 因为你结束相同状态后一个 PUT 无论你执行多少次,它被说是“平等强大”每次 - idempotent. 这是有用的自动退休

其他回答

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为创建资源工作良好.新创建资源的URL应返回位置响应标题.PUT应用于完全更新资源. 请理解这些是设计RESTful API时最好的做法. HTTP规格不限制使用PUT/POST与创建/更新资源的几个限制。

您可以在网页上找到声明说

也不是很正确。


最好选择 PUT 和 POST 之间,基于行动的可行性。

PUT 意味着放置一个资源 - 完全取代在特定 URL 上可用的任何东西与不同的东西. 根据定义,一个 PUT 是无能为力. 尽量尽量多次,结果是相同的. x=5 是无能为力. 你可以 PUT 一个资源,无论它以前存在,还是不存在(例如,创建,或更新)!

POST 更新一个资源,添加一个子资源,或引发一个变化. 一个 POST 不是 idempotent,因此 x++ 不是 idempotent。


根据这个论点,PUT是为了创建,当你知道你将创建的东西的URL。POST可以用来创建,当你知道“工厂”的URL或管理者为你想要创建的东西类别。

如:

POST /expense-report

或:

PUT  /expense-report/10929

雖然可能有一種有趣的方式來描述這些,但它似乎與從答案到網站的不同聲明相矛盾。

如果您是使用 Web API 的.NET 开发人员,事实是(从 Microsoft API 文档), http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations:

1. PUT = UPDATE (/api/products/id)
2. MCSD Exams 2014 -  UPDATE = PUT, there are **NO** multiple answers for that question period.

确保您可以使用“POST”更新,但只需跟随与您提供的框架的协议。在我的情况下,它是.NET / Web API,所以PUT是为了更新,没有讨论。

我希望这有助于任何微软开发人员阅读所有评论与亚马逊和Sun/Java网站链接。

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

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