背景信息分析:

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

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

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

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

我的问题:

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


当前回答

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 或 POST 进行如下:

更新:

只能以以下方式与PUT进行:

PUT 将资源更新为现有资源ID 作为识别器,在 / 资源 URI 或收集下。

例子: <-- 一般 - 具体 -> URI: website.example/users/john website.example - 整个网站用户 - 用户的收集 john - 收集的项目,或资源 URI:website.example/users/john/posts/23 website.example - 整个网站用户 - 用户的收集 john - 收集的项目,或资源帖子 - 收集的帖子 john 23

当你使用POST时,你总是提到收藏,所以每当你说:

POST /users HTTP/1.1

POST /users/john HTTP/1.1

它会工作,但你说你想在用户收藏下添加一个资源。

PUT /users/john HTTP/1.1

让我们来介绍一下特区的一些重要部分:

邮件

因此,它在收藏中创造了一个新的资源。

皮特

参考:

邮件 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 都可以用于创建。

你必须问“你在做什么?”来区分你应该使用什么,假设你正在设计一个API来提出问题,如果你想使用POST,那么你会这样做一个问题列表,如果你想使用PUT,那么你会这样做一个特定的问题。

你不需要支持PUT和POST。

一些考虑:

我写了以下,作为关于此问题的另一个答案的一部分:

POST: 用于修改和更新资源 POST / 问题/<existing_question> HTTP/1.1 主机: www.example.com/ 注意下列是错误: POST / 问题/<new_question> HTTP/1.1 主机: www.example.com/ 如果 URL 尚未创建,您不应该使用 POST 创建它,同时指定名称。

添加到上面的所有答案:


在职业生涯中最常用的


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

或者你可以这样做:考虑你的不安全的请求作为一个极端的单用户资源(让我们称之为行动)。客户要求一个新的“行动”在一个有意义的资源与一个空的POST到资源。

在告诉我这不是RESTful之前,请考虑遵守REST原则的众多方式. 客户不构建URL. API 仍然可发现,尽管在语法中有点变化. HTTP 字母被适当使用. 如果你认为这是一个巨大的变化来实施,我可以从经验中告诉你,这不是。