根据RFC 2616, § 9.5,POST用于创建资源:
POST
POST 方法用于请求源服务器接受请求中包含的实体作为请求行中的请求 URI 标识的资源的新从属。
根据RFC 2616, § 9.6,PUT用于创建或替换资源:
PUT
PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。如果请求 URI 引用了一个已经存在的资源,则包含的实体应该被视为驻留在源服务器上的实体的修改版本。如果 Request-URI 不指向现有资源,并且该 URI 能够被请求的用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。
那么应该使用哪种 HTTP 方法来创建资源呢?或者两者都应该支持?
全面的:
PUT 和 POST 均可用于创建。
你必须问,“你在什么上执行操作?”,以区分你应该使用什么。假设您正在设计一个用于提问的 API。如果您想使用 POST,那么您可以对问题列表执行此操作。如果您想使用 PUT,那么您将对特定问题执行此操作。
太好了,两者都可以使用,所以我应该在我的 RESTful 设计中使用哪一个:
您不需要同时支持 PUT 和 POST。
您使用哪种取决于您。但是请记住根据您在请求中引用的对象来使用正确的对象。
一些考虑:
一个例子:
我写了以下内容作为关于此的另一个答案的一部分:
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/
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> 首先将资源放在服务器上。
<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具有由包含在请求消息有效负载中的表示定义的状态。
4.3.4. PUT:
PUT 方法请求目标资源的状态是 created或replaced具有由包含在请求消息有效负载中的表示定义的状态。
created
replaced