背景信息分析:

根据 RFC 2616,第 9.5 条,POST 用于创建资源:

使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。

根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:

PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。

我的问题:

那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?


当前回答

最重要的考虑是可靠性. 如果一个 POST 消息丢失,系统的状态是不确定的. 自动恢复是不可能的. 对于 PUT 消息,状态是不确定的,直到第一次成功退出。

例如,使用 POST 创建信用卡交易可能不是一个好主意。

如果您在您的资源上有自动创建的 URI,您仍然可以使用 PUT 通过向客户端传输一个创建的 URI(指向一个空的资源)。

其他一些考虑:

POST 取消了所有包含资源的隐藏副本(更好的一致性) PUT 回复是不可隐藏的,而 POST 回复是(要求内容位置和终止) PUT 是不受 Java ME、旧浏览器、防火墙等支持。

其他回答

POST 意思是“创建新”如在“这里是创建用户的输入,为我创建它”。

PUT 的意思是“输入,如果已经存在,取代”如“这里是用户数据5”。

您 POST 到 example.com/users 因为您还不知道用户的 URL,您希望服务器创建它。

您可以访问 example.com/users/id 因为您想要更换/创建一个特定的用户。

与相同数据两次发布意味着创建两个相同的用户与不同的ID。 与相同数据两次发布会创建用户的第一个,并更新到相同状态的第二次(没有变化)。 因为你结束相同状态后一个 PUT 无论你执行多少次,它被说是“平等强大”每次 - idempotent. 这是有用的自动退休

如果您熟悉数据库操作,则有

选择输入更新 删除合并(如果已经存在,则输入更新)

我使用 PUT for 合并和更新,如操作,并使用 POST for 插入。

在很简单的方式,我正在采取Facebook时间线的例子。

案例1:当你在时间表上发布某些东西时,这是一个新鲜的新输入,所以在这种情况下,他们使用POST方法,因为POST方法是无效的。

案例2:如果你的朋友第一次评论你的帖子,它也会在数据库中创建一个新的帖子,以便使用POST方法。

案例3:如果你的朋友编辑他的评论,在这种情况下,他们有一个评论 ID,所以他们将更新一个现有评论而不是创建一个新的数据库输入。

在单行中,使用 POST 在数据库中添加一个新的输入和 PUT 在数据库中更新一些东西。

以最简单的方式解释:

POST 做它所说的, POST 意味着它提出了一个新的对象创建的请求. MDN 提到这一点为“其他副作用”,一个例子是增加指数(“POST”这个词意味着什么)。

PUT可以被认为是更新现有数据对象,当人们说它可以用于添加对象,这是因为它可以从现有父母对象更新儿童零值。

MDN 方法 PUT 文档

大多数时候,你会用它们如下:

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”框,那么您正在击败目的。