背景信息分析:

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

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

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

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

我的问题:

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


当前回答

两者都用于客户端到服务器之间的数据传输,但它们之间存在微妙的差异,即:

PUT POST
Replacing existing resource or creating if resource is not exist. www.example.com/com/customer/{customerId} www.example.com/com/customer/123/order/{orderId} Identifier is chosen by the client. Creating new resources and subordinate resources, e.g. a file is subordinate to a directory containing it or a row is subordinate to a database table. www.example.com/com/customer/ www.example.com/com/customer/123/order/ identifier is returned by server
Idempotent i.e. if you PUT a resource twice, it has no effect. Example: Do it as many times as you want, the result will be same. x=1; POST is neither safe nor idempotent. Example: x++;
Works as specific Works as abstractive
If you create or update a resource using PUT and then make that same call again, the resource is still there and still has the same state as it did with the first call. Making two identical POST requests will most likely result in two resources containing the same information.

类似:

PUT 即采取并放置它在哪里. POST 如发送邮件在邮局。

此分類上一篇

社交媒体/网络分析:

社交媒体上的帖子:当我们发布消息时,它会创建新的帖子(即编辑)我们已经发布的帖子。

其他回答

使用 POST 创建,而 PUT 更新,这就是 Ruby on Rails 如何做到这一点。

PUT    /items/1      #=> update
POST   /items        #=> create

在很简单的方式,我正在采取Facebook时间线的例子。

案例1:当你在时间表上发布某些东西时,这是一个新鲜的新输入,所以在这种情况下,他们使用POST方法,因为POST方法是无效的。

案例2:如果你的朋友第一次评论你的帖子,它也会在数据库中创建一个新的帖子,以便使用POST方法。

案例3:如果你的朋友编辑他的评论,在这种情况下,他们有一个评论 ID,所以他们将更新一个现有评论而不是创建一个新的数据库输入。

在单行中,使用 POST 在数据库中添加一个新的输入和 PUT 在数据库中更新一些东西。

POST 和 PUT 之间的区别在于服务器如何解释统一资源识别器. 使用 POST, ury 识别服务器上的对象,可以处理所包含的数据. 使用 PUT, 另一方面, ury 识别一个对象,服务器应该放置数据. 虽然 POST ury 通常指示一个程序或脚本, PUT ury 通常是路径和名称 fo

作者建议我们使用PUT上传文件,而不是POST。

正确实施,GET、HEAD、PUT 和 DELETE 方法是无效的,但不是 POST 方法,因此,当你做两个 PUT 时,你会得到一个新的记录,当你做两个 POST 时,你会得到两个新的记录。

但是,请注意,HTML 表单仅支持 GET 和 POST 作为 HTTP 请求方法。

<form method="put"> 是无效的 HTML 并将被处理为, 即发送 GET 请求。

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

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

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

一般规则:如果您知道项目的身份或名称,请使用 PUT. 如果您希望项目的身份或名称由接收者分配,请使用 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中添加。