背景信息分析:

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

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

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

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

我的问题:

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


当前回答

最重要的考虑是可靠性. 如果一个 POST 消息丢失,系统的状态是不确定的. 自动恢复是不可能的. 对于 PUT 消息,状态是不确定的,直到第一次成功退出。

例如,使用 POST 创建信用卡交易可能不是一个好主意。

如果您在您的资源上有自动创建的 URI,您仍然可以使用 PUT 通过向客户端传输一个创建的 URI(指向一个空的资源)。

其他一些考虑:

POST 取消了所有包含资源的隐藏副本(更好的一致性) PUT 回复是不可隐藏的,而 POST 回复是(要求内容位置和终止) PUT 是不受 Java ME、旧浏览器、防火墙等支持。

其他回答

总体:

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 创建它,同时指定名称。

这里是一个简单的规则:

到一个 URL 的 PUT 应该用于更新或创建可以位于该 URL 的资源。

POST to a URL should be used to update or create a resource that is located at some other ("subordinate") URL, or is not locatable via HTTP. URL 应该用于更新或创建位于某个其他(“下级”) URL 或无法通过 HTTP 找到的资源。

PUT 就像向邮箱发送一封信,或者向邮箱发送一封电子邮件, PUT 就像当你把一个对象放在一个圆洞或一个地点(它有一个已知的地址)。

通过 POST,您将被发送到 QUEUE 或 COLLECTION 的地址;通过 PUT,您将被发送到项目的地址。

PUT是无效的,您可以发送请求100次,这并不重要,POST不是无效的,如果您发送请求100次,您将在邮箱中收到100个电子邮件或100个信件。

一般规则:如果您知道项目的身份或名称,请使用 PUT. 如果您希望项目的身份或名称由接收者分配,请使用 POST。

此分類上一篇

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: 使用它来创建新的资源. 它类似于 INSERT (SQL 声明) 具有自动增强 ID. 在回复部分中,它包含一个新生成的 ID。

POST 也用于更新记录。

PUT:使用它来创建一个新的资源,但在这里我知道身份密钥,它就像INSERT(SQL声明),在那里我提前知道身份密钥。

PUT 也用于更新资源