rest HTTP中POST和PUT的区别是什么?
根据RFC 2616, § 9.5,POST
用于创建资源:
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line.
根据RFC 2616, § 9.6,PUT
用于创建或替换资源:
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
那么应该使用哪个HTTP方法来创建资源呢?或者两者都应该得到支持
# 1 楼答案
总结:
创建:
可通过以下方式使用PUT或POST执行:
更新:
只能通过以下方式使用PUT执行:
说明:
将REST和URI作为常规处理时,在左侧上有通用,在右侧上有特定。泛型通常被称为集合,而更具体的项目可以被称为资源。请注意,资源可以包含集合
当你使用POST时,你总是引用一个集合,所以无论何时你说:
您正在向用户集合发布新用户
如果您继续尝试以下内容:
它会起作用,但从语义上讲,您是说您希望向用户集合下的john集合添加资源
使用PUT后,您将引用资源或单个项目,可能位于集合中。所以当你说:
您正在告诉服务器更新,或者创建用户集合下的john资源
规格:
让我强调一下规范的一些重要部分:
POST
因此,在集合上创建一个新的资源
放置
因此,根据资源的存在创建或更新
参考:
# 2 楼答案
POST
表示“创建新的”,如“这里是创建用户的输入,为我创建它”PUT
表示“插入,如果已经存在则替换”,如“这是用户5的数据”你可以
POST
举例说明。com/users因为您还不知道用户的URL
,所以希望服务器创建它你可以
PUT
举例说明。com/users/id,因为您要替换/创建一个特定的用户使用相同数据发布两次意味着创建两个具有不同ID的相同用户。使用相同的数据放置两次会创建第一个用户,并在第二次将其更新为相同的状态(无更改)。因为无论执行多少次
PUT
之后都会得到相同的状态,所以每次都被称为“同等有效”——幂等。这对于自动重试请求很有用。按下浏览器上的“后退”按钮时,不再显示“是否确实要重新发送”一般建议是在需要服务器控制资源的
URL
生成时使用POST
。否则使用PUT
。喜欢PUT
胜过POST
# 3 楼答案
总体:
PUT和POST都可以用于创建
你必须问,“你在做什么?”,来区分你应该使用什么。假设您正在设计一个用于提问的API。如果您想使用POST,那么您可以对一系列问题执行此操作。如果你想使用PUT,那么你会对一个特定的问题这样做
太好了,两者都可以使用,那么在我的RESTful设计中应该使用哪一种:
您不需要同时支持PUT和POST
你用什么取决于你自己。但是请记住,根据您在请求中引用的对象,使用正确的方法
一些考虑:
一个例子:
作为another answer on SO regarding this的一部分,我写了以下内容:
此外,更简洁地说,RFC 7231 Section 4.3.4 PUT状态(强调添加)
# 4 楼答案
你可以在网上找到这样的断言
两者都不完全正确
更好的方法是根据动作的idempotence在PUT和POST之间进行选择
放置意味着放置一个资源-用一个不同的东西完全替换给定URL上可用的任何东西。根据定义,PUT是幂等的。你想做多少次就做多少次,结果都一样
x=5
是幂等的。您可以放置资源,无论它以前是否存在(例如,创建或更新)POST更新资源、添加辅助资源或引起更改。POST不是幂等的,正如
x++
不是幂等的一样通过这个参数,PUT用于在您知道要创建的对象的URL时创建。当您知道要创建的类别的“工厂”或经理的URL时,可以使用POST来创建
因此:
或:
# 5 楼答案
PUT和POST的相关规范为RFC 2616 §9.5ff.
POST创建一个子资源,因此POST to
/items
将创建一个位于/items
资源下的资源。 例如/items/1
。两次发送相同的post数据包将创建两个资源PUT用于在客户端已知的URL上创建或替换资源
因此:PUT只是创建的候选项,其中客户端在创建资源之前已经知道url。例如
/blogs/nigel/entry/when_to_use_post_vs_put
作为标题用作资源键PUT替换已知url上已存在的资源,因此两次发送同一请求无效。换句话说,对PUT的调用是幂等的
RFC的内容如下:
注意:PUT主要用于更新资源(通过替换资源的整体),但最近出现了使用补丁更新现有资源的趋势,因为PUT指定它替换整个资源RFC 5789.
2018年更新:有一种情况可以避免出售。见"REST without PUT"
摘自REST API Design - Resource Modeling by Prakash Subramaniam of Thoughtworks
这迫使API避免在多个客户端更新单个资源时出现状态转换问题,并与事件源和CQR更好地匹配。当工作以异步方式完成时,发布转换并等待其应用似乎是合适的
# 6 楼答案
我想补充我的“务实”建议。当您知道可以检索要保存的对象的“id”时,请使用PUT。如果您需要(比如)返回一个数据库生成的id,以便将来进行查找或更新,那么使用PUT将不会太好
因此:要保存现有用户,或客户端生成id并已验证id唯一的用户,请执行以下操作:
否则,使用POST最初创建对象,并使用PUT更新对象: