HTTP 中的 POST 和 PUT 有什么区别?

问题描述

PUT 和 POST 均可用于创建。

你必须问,“你在什么上执行操作?”,以区分你应该使用什么。假设您正在设计一个用于提问的 API。如果您想使用 POST,那么您可以对问题列表执行此操作。如果您想使用 PUT,那么您将对特定问题执行此操作。

您不需要同时支持 PUT 和 POST。

您使用哪种取决于您。但是请记住根据您在请求中引用的对象来使用正确的对象。

一些考虑:

  • 您是明确命名您创建的 URL 对象,还是让服务器决定?如果您命名它们,则使用 PUT。如果您让服务器决定,则使用 POST。
  • PUT 被定义为假设幂等性,所以如果你 PUT 一个对象两次,它应该没有额外的影响。这是一个很好的属性,所以我会尽可能使用 PUT。只需确保 PUT 幂等性实际上在服务器中正确实现。
  • 您可以使用具有相同对象 URL 的 PUT 更新或创建资源
  • 使用 POST,您可以同时收到 2 个请求,对 URL 进行修改,并且它们可能会更新对象的不同部分。

我写了以下内容作为关于此的另一个答案的一部分:

用于修改和更新资源

POST /questions/<existing_question> HTTP/1.1 Host: www.example.com/

请注意,以下是错误

POST /questions/<new_question> HTTP/1.1 Host: www.example.com/

如果尚未创建 URL,则在指定名称时不应使用 POST 来创建它。这应该导致“找不到资源”错误,因为<new_question>尚不存在。您应该<new_question> 首先将资源放在服务器上。

您可以执行以下操作来使用 POST 创建资源:

POST /questions HTTP/1.1 Host: www.example.com/

请注意,在这种情况下,未指定资源名称,新对象 URL 路径将返回给您。

用于创建资源,或覆盖它。当您指定资源的新 URL 时。

对于新资源:

PUT /questions/<new_question> HTTP/1.1 Host: www.example.com/

要覆盖现有资源:

PUT /questions/<existing_question> HTTP/1.1 Host: www.example.com/

此外,更简洁一点,RFC 7231 第 4.3.4 节 PUT状态(添加了重点),

PUT:

PUT 方法请求目标资源的状态是 createdreplaced具有由包含在请求消息有效负载中的表示定义的状态。

解决方法

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

POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识的资源的新从属。

根据RFC 2616,§ 9.6PUT用于创建或替换资源:

PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。如果请求 URI 引用了一个已经存在的资源,则包含的实体应该被视为驻留在源服务器上的实体的修改版本。如果 Request-URI 不指向现有资源,并且该 URI 能够被请求的用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。

那么应该使用哪种 HTTP 方法来创建资源呢?或者两者都应该支持?

相关文章

猜你在找的编程问答相关文章

怎样才能让 Git“忘记”一个被跟踪但现在在 .gitignore 中的文件?
Python 中的metaclasses是什么?
如何在 Linux 上查找包含特定文本的所有文件?
如何从异步调用返回响应
如何在一个表达式中合并两个字典(取字典的并集)?
HTTP 中的 POST 和 PUT 有什么区别?
使用 Git 将最近的提交移动到新分支
在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?