背景信息分析:

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

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

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

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

我的问题:

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


当前回答

我想添加我的“实用”建议. 使用 PUT 当你知道“ID”可以恢复你正在储存的对象. 使用 PUT 不会工作太好,如果你需要, 说, 数据库创建的 ID 将被返回给你进行未来的搜索或更新。

因此: 保存现有用户,或者客户端创建 ID 的用户,并确认 ID 是独一无二的:

PUT /user/12345 HTTP/1.1  <-- create the user providing the id 12345
Host: mydomain.example

GET /user/12345 HTTP/1.1  <-- return that user
Host: mydomain.example

否则,使用 POST 首先创建对象,然后使用 PUT 更新对象:

POST /user HTTP/1.1   <--- create the user, server returns 12345
Host: mydomain.example

PUT /user/12345 HTTP/1.1  <--- update the user
Host: mydomain.example

其他回答

邮件 vs 邮件

邮件

http://example.com/form

http://example.com/form/568

PUT需要知道这个地址点给一个实体!

http://example.com/097243523581549126143698

您是否知道过去 20+ 年内浏览器中的 HTML 表格方法属性仅支持 POST 和 GET,并且不支持 PUT?

POST and GET work ok...
<form id="form1" name="form1" method="get" action="/form">...</form>
<form id="form2" name="form2" method="post" action="/form">...</form>

PUT NOT SUPPORTED!
<form id="form3" name="form3" method="put" action="/form">...</form>

DELETE NOT SUPPORTED!
<form id="form4" name="form4" method="delete" action="/form">...</form>

疯了啊?

然后,服务器必须仔细观察这个URL(加上按下“添加”,“删除”,“更新”等任何按钮)决定什么是正确的字母,然后路由POST或PUT或DELETE等到正确的服务器处理器。

事实上,PUT一直连接到URL识别器,而不是您的客户端侧代码的逻辑,但它是当今客户端侧模型的错误性质,其破碎的HTML5设计,加上当今厚客户端JavaScript API呼叫和其他循环技巧的腐败性质,这些技巧污染了应该是一个非常简单的HTTP标准,很久以前由非常有前途的人创建。

两者都用于客户端到服务器之间的数据传输,但它们之间存在微妙的差异,即:

PUT POST
Replacing existing resource or creating if resource is not exist. www.example.com/com/customer/{customerId} www.example.com/com/customer/123/order/{orderId} Identifier is chosen by the client. Creating new resources and subordinate resources, e.g. a file is subordinate to a directory containing it or a row is subordinate to a database table. www.example.com/com/customer/ www.example.com/com/customer/123/order/ identifier is returned by server
Idempotent i.e. if you PUT a resource twice, it has no effect. Example: Do it as many times as you want, the result will be same. x=1; POST is neither safe nor idempotent. Example: x++;
Works as specific Works as abstractive
If you create or update a resource using PUT and then make that same call again, the resource is still there and still has the same state as it did with the first call. Making two identical POST requests will most likely result in two resources containing the same information.

类似:

PUT 即采取并放置它在哪里. POST 如发送邮件在邮局。

此分類上一篇

社交媒体/网络分析:

社交媒体上的帖子:当我们发布消息时,它会创建新的帖子(即编辑)我们已经发布的帖子。

Create => HTTP PUT
Retrieve => HTTP GET
Update => HTTP POST
Delete => HTTP DELETE

事实上, CRUD 操作的 R(选择) 和 D(选择) 可以直接地图到 HTTP 方法 GET 和 DELETE 相应。 然而,混淆在 C(现实) 和 U(更新) 操作中。 在某些情况下,可以使用 PUT 为创建而在其他情况下需要 POST。

基于上述定义,我的使用 HTTP PUT 方法与使用 HTTP POST 方法为 REST 服务是: 使用 HTTP PUT 方法,当:

The client includes all aspect of the resource including the unique identifier to uniquely identify the resource. Example: creating a new employee.
The client provides all the information for a resource to be able to modify that resource.This implies that the server side does not update any aspect of the resource (such as an update date).

The server will provide some information concerning the newly created resource. For example, take a logging system. A new entry in the log will most likely have a numbering scheme which is determined on the server side. Upon creating a new log entry, the new sequence number will be determined by the server and not by the client.
On a modification of a resource, the server will provide such information as a resource state or an update date. Again in this case not all information was provided by the client and the resource will be changing from one modification request to the next. Hence a non idempotent operation.

结论

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

添加到上面的所有答案:


在职业生涯中最常用的


我们使用 PUT over POST 在 CREATE 操作中. 为什么? 因为很多在这里也说,答案是不可隐藏的,而 POST 是(要求内容位置和终止)。 我们使用 POST over PUT 在 UPDATE 操作中. 为什么? 因为它破坏了整个包含资源的隐藏副本. 这是有用的,当更新资源。