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

发布时间 2023-10-08 21:13:15作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=HTTP中的POST和PUT有什么区别?

背景信息分析:

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

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

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

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

我的问题:

那么,应该使用哪个HTTP方法来创建资源?还是应该同时支持两者?


总体:

PUT和POST都可以用于创建资源。

你需要问自己,“你要对什么对象执行操作?”,以区分你应该使用哪个方法。假设你正在设计一个询问问题的API。如果你想使用POST,那么你会向问题列表执行操作。如果你想使用PUT,那么你会向特定问题执行操作。

很好,两者都可以使用,那么在RESTful设计中我应该使用哪一个呢?

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

使用哪一个取决于你在请求中引用的对象。

一些考虑事项:

  • 你是否为创建的URL对象显式命名,还是让服务器决定?如果你命名它们,则使用PUT。如果你让服务器决定,则使用POST。
  • PUT被定义为幂等的,因此如果你对一个对象执行两次PUT操作,它不应该有额外的效果。这是一个好的特性,因此我尽可能使用PUT。只要确保服务器正确实现了PUT-幂等性。
  • 你可以使用相同的对象URL来更新或创建一个资源
  • 使用POST,你可以同时有两个请求进来,修改一个URL,它们可能会更新对象的不同部分。

示例:

我写了以下内容作为我在SO上关于这个问题的另一个答案的一部分:

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>尚不存在。你应该首先在服务器上使用PUT PUT <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,状态由请求消息有效负载中包含的表示定义。