背景信息分析:

根据 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

其他回答

在很简单的方式,我正在采取Facebook时间线的例子。

案例1:当你在时间表上发布某些东西时,这是一个新鲜的新输入,所以在这种情况下,他们使用POST方法,因为POST方法是无效的。

案例2:如果你的朋友第一次评论你的帖子,它也会在数据库中创建一个新的帖子,以便使用POST方法。

案例3:如果你的朋友编辑他的评论,在这种情况下,他们有一个评论 ID,所以他们将更新一个现有评论而不是创建一个新的数据库输入。

在单行中,使用 POST 在数据库中添加一个新的输入和 PUT 在数据库中更新一些东西。

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

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 如发送邮件在邮局。

此分類上一篇

社交媒体/网络分析:

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

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

如果您是使用 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网站链接。

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.

结论

简短答案:

简单的规则:使用 POST 创建,使用 PUT 更新。

长答:

邮件:

POST 用于向服务器发送数据,当资源的 URL 未知时有用

皮特:

PUT 用于将状态转移到使用的服务器,当资源的 URL 已知时

更长的答案:

要了解它,我们需要质疑为什么PUT是必要的,什么问题PUT试图解决POST不能。

从REST架构的角度来看,这并不重要,我们也可能没有PUT,但从客户开发者的角度来看,它使他的生活更简单。

在PUT之前,客户无法直接知道服务器所产生的URL,或者如果它全部产生的URL,或者是否要发送到服务器的数据已经更新了,PUT缓解了所有这些头痛的开发者。