背景信息分析:
根据 RFC 2616,第 9.5 条,POST 用于创建资源:
使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。
根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:
PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。
我的问题:
那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?
您可以在网页上找到声明说
也不是很正确。
最好选择 PUT 和 POST 之间,基于行动的可行性。
PUT 意味着放置一个资源 - 完全取代在特定 URL 上可用的任何东西与不同的东西. 根据定义,一个 PUT 是无能为力. 尽量尽量多次,结果是相同的. x=5 是无能为力. 你可以 PUT 一个资源,无论它以前存在,还是不存在(例如,创建,或更新)!
POST 更新一个资源,添加一个子资源,或引发一个变化. 一个 POST 不是 idempotent,因此 x++ 不是 idempotent。
根据这个论点,PUT是为了创建,当你知道你将创建的东西的URL。POST可以用来创建,当你知道“工厂”的URL或管理者为你想要创建的东西类别。
如:
POST /expense-report
或:
PUT /expense-report/10929
您可以在网页上找到声明说
也不是很正确。
最好选择 PUT 和 POST 之间,基于行动的可行性。
PUT 意味着放置一个资源 - 完全取代在特定 URL 上可用的任何东西与不同的东西. 根据定义,一个 PUT 是无能为力. 尽量尽量多次,结果是相同的. x=5 是无能为力. 你可以 PUT 一个资源,无论它以前存在,还是不存在(例如,创建,或更新)!
POST 更新一个资源,添加一个子资源,或引发一个变化. 一个 POST 不是 idempotent,因此 x++ 不是 idempotent。
根据这个论点,PUT是为了创建,当你知道你将创建的东西的URL。POST可以用来创建,当你知道“工厂”的URL或管理者为你想要创建的东西类别。
如:
POST /expense-report
或:
PUT /expense-report/10929
对于我来说,了解区别的关键是了解谁定义资源的ID:
例子(与某些地址服务)
POST (sever creates new resource)
client server/addresses // NOTE: no ID in the request
| |
| --{POST address data}--> |
| |
| <--{201, created addresses/321} | // NOTE: resource ID in the reply
| |
PUT (sever sets data of resource, creating it if necessary)
client server/addresses/321 // NOTE: *you* put the ID here!
| |
| --{PUT address data (to 321)}-->|
| |
| <--{201, created } | // NOTE: resource ID not required here
| |
这里有很多很好的答案,下面有很好的细节,但这帮助了我到达这个点。
简短答案:
简单的规则:使用 POST 创建,使用 PUT 更新。
长答:
邮件:
POST 用于向服务器发送数据,当资源的 URL 未知时有用
皮特:
PUT 用于将状态转移到使用的服务器,当资源的 URL 已知时
更长的答案:
要了解它,我们需要质疑为什么PUT是必要的,什么问题PUT试图解决POST不能。
从REST架构的角度来看,这并不重要,我们也可能没有PUT,但从客户开发者的角度来看,它使他的生活更简单。
在PUT之前,客户无法直接知道服务器所产生的URL,或者如果它全部产生的URL,或者是否要发送到服务器的数据已经更新了,PUT缓解了所有这些头痛的开发者。
总结
参考
POST 和 PUT 方法之间的基本差异被关闭代表性的不同意图所突出。 POST 请求中的目标资源旨在根据资源的本质处理关闭代表性,而 PUT 请求中的关闭代表性则被定义为取代目标资源的状态。
但建议始终使用更专门的请求方法而不是 POST 适当时,因为它为中介提供更多信息,以自动化信息获取(因为 GET、HEAD、OPTIONS 和 TRACE 被定义为安全),处理通信故障(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效),并优化存储性能(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效)。