在REST中放置与POST
根据HTTP / 1.1规范:
POST
方法用于请求源服务器接受请求中包含的实体作为Request-Line
Request-URI
标识的资源的新下属
换句话说, POST
用于创建 。
PUT
方法要求封闭实体存储在提供的Request-URI
。 如果Request-URI
指向一个已经存在的资源,那么封闭的实体应该被认为是驻留在原始服务器上的修改版本。 如果Request-URI
不指向现有资源,并且该URI可以被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源。“
也就是说, PUT
用于创建或更新 。
那么,应该使用哪一个来创建资源? 或者需要支持两者?
总体:
PUT和POST都可以用于创建。
你必须问:“你在做什么?” 区分你应该使用什么。 假设您正在设计一个提问问题的API。 如果你想使用POST,那么你会这样做的问题列表。 如果你想使用PUT,那么你会对特定的问题做到这一点。
这两个都可以使用,所以我应该在我的RESTful设计中使用哪一个:
您不需要同时支持PUT和POST。
使用的是留给你的。 但请记住根据您在请求中引用的对象来使用正确的对象。
一些考虑:
一个例子:
我写了以下内容作为关于这个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>
尚不存在。 您应该首先在服务器上放置<new_question>
资源。
你可以通过POST来创建一个资源:
POST /questions HTTP/1.1
Host: www.example.com/
请注意,在这种情况下,资源名称未指定,新对象URL路径将返回给您。
放:
用于创建资源或覆盖它。 当你指定资源新的URL时。
对于新资源:
PUT /questions/<new_question> HTTP/1.1
Host: www.example.com/
要覆盖现有资源:
PUT /questions/<existing_question> HTTP/1.1
Host: www.example.com/
你可以在网上找到说的断言
这两个都不对。
更好的是基于动作的幂等性在PUT和POST之间进行选择。
PUT意味着放置一个资源 - 用一个不同的东西完全替代给定URL中的可用资源。 根据定义,PUT是幂等的。 随心所欲地做多次,结果是一样的。 x=5
是幂等的。 无论以前是否存在资源(例如创建或更新),您都可以放入资源!
POST更新资源,添加辅助资源或导致更改。 POST不是幂等的,因为x++
不是幂等的。
通过这个参数,PUT用于创建当你知道你要创建的东西的URL。 当您知道要创建的事物类别的“工厂”或经理的URL时,可以使用POST创建。
所以:
POST /expense-report
要么:
PUT /expense-report/10929
PUT和POST的相关规范是RFC 2616§9.5ff。
POST会创建一个子资源 ,因此POST到/items
会创建一个位于/items
资源下的资源。 例如。 /items/1
。 两次发送相同的post数据包将创建两个资源。
PUT用于在客户端已知的URL上创建或替换资源。
因此: PUT仅仅是CREATE的候选者,其中客户端在创建资源之前已经知道url。 例如。 /blogs/nigel/entry/when_to_use_post_vs_put
作为标题用作资源键
如果已知的URL已经存在, PUT将替换资源,因此两次发送相同请求不起作用。 换句话说, 对PUT的调用是幂等的 。
RFC的读法是这样的:
POST和PUT请求之间的根本区别反映在请求URI的不同含义中。 POST请求中的URI标识将处理封闭实体的资源。 该资源可能是数据接受过程,其他协议的入口或接受注释的独立实体。 相比之下,PUT请求中的URI标识请求附带的实体 - 用户代理知道URI的目标是什么,服务器不能尝试将请求应用于其他资源。 如果服务器希望将请求应用于不同的URI,
注意: PUT主要用于更新资源(通过全部替换它们),但最近出现了使用PATCH更新现有资源的趋势,因为PUT指定它替换整个资源。 RFC 5789。
链接地址: http://www.djcxy.com/p/93.html上一篇: PUT vs. POST in REST