一尘不染

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

http

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

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

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

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

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


阅读 326

收藏
2022-01-04

共1个答案

一尘不染

全面的:

PUT 和 POST 均可用于创建。

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

太好了,两者都可以使用,所以我应该在我的 RESTful 设计中使用哪一个:

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

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

一些考虑:

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

一个例子:

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

POST:

用于修改和更新资源

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 路径将返回给您。

PUT:

用于创建资源,或覆盖它。当您指定资源的新 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状态(添加了重点),

4.3.4. PUT:

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

2022-01-04