内容来自 DOC https://q.houxu6.top/?s=HTTP中的POST和PUT有什么区别?
背景信息分析:
根据RFC 2616, § 9.5,POST
用于创建资源:
POST方法用于请求源服务器接受请求实体作为由请求行中的Request-URI标识的资源的新从属实体。
根据RFC 2616, § 9.6,PUT
用于创建或替换资源:
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方法要求目标资源的状态被
created
或replaced
,状态由请求消息有效负载中包含的表示定义。