背景信息分析:

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

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

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

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

我的问题:

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


当前回答

除了其他人提出的差异之外,我想添加另一个。

在 POST 方法中,您可以在表格数据中发送身体参数

在 PUT 方法中,您必须在 x-www-form-urlencoded 中发送身体参数

标题内容类型:应用程序/x-www-form-urlencoded

因此,您不能在 PUT 方法中发送文件或多部分数据。

编辑

内容类型“应用/x-www-form-urlencoded”是不有效的发送大量的二进制数据或包含非ASCII字符的文本. 内容类型“多部分/形式数据”应用于提交包含文件、非ASCII数据和二进制数据的表格。

如果你要提交的话

文件,非ASCII数据,和二进制数据

你应该使用邮政方法。

其他回答

除了其他人提出的差异之外,我想添加另一个。

在 POST 方法中,您可以在表格数据中发送身体参数

在 PUT 方法中,您必须在 x-www-form-urlencoded 中发送身体参数

标题内容类型:应用程序/x-www-form-urlencoded

因此,您不能在 PUT 方法中发送文件或多部分数据。

编辑

内容类型“应用/x-www-form-urlencoded”是不有效的发送大量的二进制数据或包含非ASCII字符的文本. 内容类型“多部分/形式数据”应用于提交包含文件、非ASCII数据和二进制数据的表格。

如果你要提交的话

文件,非ASCII数据,和二进制数据

你应该使用邮政方法。


POST 可以执行其他三项功能,但随后请求的语法将失去在中间人,如Caches 和 Proxy. 这也适用于提供资源的安全性,因为一个帖子的 URI 不一定指示它正在应用的资源(但它可以)。


编辑: 另一个事情 - 一个 PUT 可以创建,但如果这样做,那么 ID 必须是一个自然 ID - AKA 一个电子邮件地址。

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

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

添加到上面的所有答案:


在职业生涯中最常用的


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

REST 是一个非常高级别的概念,事实上,它甚至没有提到 HTTP!

如果你有任何疑问如何在HTTP中实施REST,你总是可以看看原子出版协议(AtomPub)的规格. AtomPub是由许多HTTP和REST灯台开发的HTTP的RESTful网页服务的标准,其中一些来自Roy Fielding,REST的发明家和(共同)HTTP的发明家。

事实上,你甚至可以直接使用 AtomPub. 虽然它来自博客社区,它没有任何限制博客: 这是一个通用协议,以便通过 HTTP 与自愿的(自愿的)资源集合相互作用。

以下是 AtomPub 對資源創造的說法(第 9.2 節):

要将会员添加到集合中,客户将 POST 请求发送到集合的 URI。