背景信息分析:

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

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

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

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

我的问题:

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


当前回答

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

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

其他回答

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

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

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

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

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

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

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

编辑

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

如果你要提交的话

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

你应该使用邮政方法。

简而言之:

分析与数据库查询

PUT 您可以想象类似于“UPDATE STUDENT SET 地址 = “abc” 在 id="123”;

在 POST 案例中,如果同一查询多次执行,则在数据库中创建了多个学生记录,数据库状态在每个“INSERT”查询的执行时都会发生变化。

注意: PUT 需要一个资源位置(现有资源),更新需要发生,而 POST 则不需要这样做。

有些人可能會發現這些更新可以用 POST 進行. 沒有嚴格的規則,哪一個要用於更新或哪一個要用於創造。

我认为还有一个有趣的点,没有在这个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中添加。

总结

参考

POST 和 PUT 方法之间的基本差异被关闭代表性的不同意图所突出。 POST 请求中的目标资源旨在根据资源的本质处理关闭代表性,而 PUT 请求中的关闭代表性则被定义为取代目标资源的状态。

但建议始终使用更专门的请求方法而不是 POST 适当时,因为它为中介提供更多信息,以自动化信息获取(因为 GET、HEAD、OPTIONS 和 TRACE 被定义为安全),处理通信故障(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效),并优化存储性能(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效)。