背景信息分析:
根据 RFC 2616,第 9.5 条,POST 用于创建资源:
使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。
根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:
PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。
我的问题:
那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?
被认为是不同的,在这个“PUT”,如“GET”被认为是无效的 - 也就是说,你可以要求相同的准确的PUT多次,结果将是像你执行它只有一次。
我将描述我认为最广泛使用和最有用的条约:
当你在一个特定的URL中找到一个资源时,发生的事情就是它应该在这个URL上存储,或者沿着这些行走。
例如,当你想创建一个新流时,你可以将其输入到某些URL,但是当你想向现有流发送一个消息时,你可以将其输入到URL。
至于修改流的属性,您可以使用 PUT 或 POST. 基本上,只使用“PUT”当操作是无效的 - 否则使用 POST。
但是,请注意,并不是所有现代浏览器都支持其他HTTP字母,而不是GET或POST。
简短答案:
简单的规则:使用 POST 创建,使用 PUT 更新。
长答:
邮件:
POST 用于向服务器发送数据,当资源的 URL 未知时有用
皮特:
PUT 用于将状态转移到使用的服务器,当资源的 URL 已知时
更长的答案:
要了解它,我们需要质疑为什么PUT是必要的,什么问题PUT试图解决POST不能。
从REST架构的角度来看,这并不重要,我们也可能没有PUT,但从客户开发者的角度来看,它使他的生活更简单。
在PUT之前,客户无法直接知道服务器所产生的URL,或者如果它全部产生的URL,或者是否要发送到服务器的数据已经更新了,PUT缓解了所有这些头痛的开发者。
创建:
可以用 PUT 或 POST 进行如下:
更新:
只能以以下方式与PUT进行:
PUT 将资源更新为现有资源ID 作为识别器,在 / 资源 URI 或收集下。
例子: <-- 一般 - 具体 -> URI: website.example/users/john website.example - 整个网站用户 - 用户的收集 john - 收集的项目,或资源 URI:website.example/users/john/posts/23 website.example - 整个网站用户 - 用户的收集 john - 收集的项目,或资源帖子 - 收集的帖子 john 23
当你使用POST时,你总是提到收藏,所以每当你说:
POST /users HTTP/1.1
POST /users/john HTTP/1.1
它会工作,但你说你想在用户收藏下添加一个资源。
PUT /users/john HTTP/1.1
让我们来介绍一下特区的一些重要部分:
邮件
因此,它在收藏中创造了一个新的资源。
皮特
参考:
大多数时候,你会用它们如下:
POST a resource into a collection PUT a resource identified by collection/:id。
例如:
POST /items PUT /items/1234
请注意,POST在收藏中“创建”一个新的元素,而PUT在某个URL中“替换”一个元素,但使用PUT进行部分修改是一种非常常见的做法,也就是说,只使用它来更新现有资源,并仅修改体内所包含的字段(忽略其他字段)。
请记住,REST是一组条约和指导方针,以保持您的API简单。 如果您结束了一个复杂的工作周围,只需检查“RESTfull”框,那么您正在击败目的。
总结
参考
POST 和 PUT 方法之间的基本差异被关闭代表性的不同意图所突出。 POST 请求中的目标资源旨在根据资源的本质处理关闭代表性,而 PUT 请求中的关闭代表性则被定义为取代目标资源的状态。
但建议始终使用更专门的请求方法而不是 POST 适当时,因为它为中介提供更多信息,以自动化信息获取(因为 GET、HEAD、OPTIONS 和 TRACE 被定义为安全),处理通信故障(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效),并优化存储性能(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效)。