背景信息分析:

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

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

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

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

我的问题:

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


当前回答

邮件 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标准,很久以前由非常有前途的人创建。

其他回答

上面和下面的所有答案都是正确的,只是一个小(重要)笔记. 所有这些“句子”都是建议,他们的效果没有执行. 服务器是免费的做他们想要什么,这意味着写与GET或服务器想要什么。

PHP 例如,阅读 $_POST 和 $_GET. 它完全取决于程序员将通过从这些序列中阅读变量进行什么。

我认为还有一个有趣的点,没有在这个PUT vs POST问题上分享:

如果您想要一个没有JavaScript的Web应用程序(例如,如果有人使用一个命令线浏览器,如Lynx或一个浏览器插件,如NoScript或Mmatrix),您将不得不使用POST发送数据,因为HTML表单仅支持GET和POSTHTTP请求。

基本上,如果您想要使用逐步改进(https://en.wikipedia.org/wiki/Progressive_enhancement)让您的网页应用程序在任何地方工作,有和没有JavaScript,您无法使用其他HTTP方法,如PUT或DELETE,这些方法仅在HTTP版本1中添加。

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

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

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

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

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

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

POST 也用于更新记录。

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

PUT 也用于更新资源

我喜欢这个建议,从RFC 2616的定义PUT:

我解释了这一点,以及PUT的身份要求,这意味着:

POST 很好在收藏下创建新的对象(而创建不需要是同效的) PUT 很好在更新现有对象(而更新需要是同效的) POST 也可以用于对现有对象的非同效的更新(特别是,改变对象的一部分,而不说明整个事物 - 如果你想到它,创建一个新成员的收藏实际上是