背景信息分析:

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

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

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

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

我的问题:

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


当前回答

原始服务器可以使用此 URI 创建资源

所以你使用POST和可能,但不需要PUT为资源创建. 你不需要支持两者. 对于我来说,POST是完美的足够。

如您的引用所提到的,您使用 PUT 创建没有资源分配到 IRI,您希望创建一个资源无论如何. 例如, PUT /users/123/password 通常将旧密码替换为新密码,但您可以使用它创建一个密码,如果它已经不存在(例如,由新鲜注册的用户或通过恢复被禁止的用户)。

其他回答

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

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

Ruby on Rails 4.0 将使用“PATCH”方法而不是 PUT 进行部分更新。

RFC 5789 讲述了 PATCH (自 1995 年以来):

一个新的方法是必要的,以改善互动性和防止错误. PUT 方法已经定义,以重新编写一个资源与一个完整的新体,并且不能重新使用,以进行部分变更。 否则, proxies 和 cache,甚至客户端和服务器,可能会被混淆的结果操作。 POST 已经使用,但没有广泛的互动性(

“Edge Rails: PATCH 是更新的新主要 HTTP 方法,”它解释。

POST 和 PUT 之间的区别在于服务器如何解释统一资源识别器. 使用 POST, ury 识别服务器上的对象,可以处理所包含的数据. 使用 PUT, 另一方面, ury 识别一个对象,服务器应该放置数据. 虽然 POST ury 通常指示一个程序或脚本, PUT ury 通常是路径和名称 fo

作者建议我们使用PUT上传文件,而不是POST。

正确实施,GET、HEAD、PUT 和 DELETE 方法是无效的,但不是 POST 方法,因此,当你做两个 PUT 时,你会得到一个新的记录,当你做两个 POST 时,你会得到两个新的记录。

但是,请注意,HTML 表单仅支持 GET 和 POST 作为 HTTP 请求方法。

<form method="put"> 是无效的 HTML 并将被处理为, 即发送 GET 请求。

REST 是一个非常高级别的概念,事实上,它甚至没有提到 HTTP!

如果你有任何疑问如何在HTTP中实施REST,你总是可以看看原子出版协议(AtomPub)的规格. AtomPub是由许多HTTP和REST灯台开发的HTTP的RESTful网页服务的标准,其中一些来自Roy Fielding,REST的发明家和(共同)HTTP的发明家。

事实上,你甚至可以直接使用 AtomPub. 虽然它来自博客社区,它没有任何限制博客: 这是一个通用协议,以便通过 HTTP 与自愿的(自愿的)资源集合相互作用。

以下是 AtomPub 對資源創造的說法(第 9.2 節):

要将会员添加到集合中,客户将 POST 请求发送到集合的 URI。

以最简单的方式解释:

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

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

MDN 方法 PUT 文档