背景资料分析:
根据RFC 2616,第 9.5 节 https://www.rfc-editor.org/rfc/rfc2616#section-9.5, POST
习惯于create资源:
POST 方法用于请求源服务器接受请求中包含的实体,作为请求行中的请求 URI 标识的资源的新下属。
根据RFC 2616,第 9.6 节 https://www.rfc-editor.org/rfc/rfc2616#section-9.6, PUT
习惯于创建或替换资源:
PUT 方法请求将所包含的实体存储在提供的 Request-URI 下。如果 Request-URI 引用一个已经存在的资源,则所包含的实体应该被视为驻留在源服务器上的实体的修改版本。如果请求 URI 不指向现有资源,并且该 URI 能够被请求用户代理定义为新资源,则源服务器可以使用该 URI 创建资源。
我的问题:
那么,应该使用哪种 HTTP 方法来创建资源呢?或者两者都应该支持?
Overall:
PUT 和 POST 都可以用于创建。
您必须问“您正在对什么执行操作?”,以区分您应该使用什么。假设您正在设计一个用于提问的 API。如果您想使用 POST,那么您可以对问题列表执行此操作。如果您想使用 PUT,那么您可以对特定问题执行此操作。
太好了,两者都可以使用,那么我应该在 RESTful 设计中使用哪一个:
您不需要同时支持 PUT 和 POST。
您使用哪个取决于您。但请记住根据您在请求中引用的对象来使用正确的对象。
一些注意事项:
- 您是否明确命名创建的 URL 对象,还是让服务器决定?如果您命名它们,则使用 PUT。如果让服务器决定,则使用 POST。
- PUT 被定义为假定幂等性,因此如果您将一个对象 PUT 两次,它应该不会产生额外的效果。这是一个很好的属性,所以我会尽可能使用 PUT。只需确保 PUT 幂等性实际上在服务器中正确实现即可。
- 您可以使用具有相同对象 URL 的 PUT 更新或创建资源
- 使用 POST,您可以同时收到 2 个请求来修改 URL,并且它们可能会更新对象的不同部分。
一个例子:
我写了以下内容作为关于此问题的另一个答案 https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359:
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 https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4状态(强调),
4.3.4.放
PUT 方法请求目标资源的状态为created
or replaced
具有由表示定义的状态
包含在请求消息有效负载中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)