背景信息分析:
根据 RFC 2616,第 9.5 条,POST 用于创建资源:
使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。
根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:
PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。
我的问题:
那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?
步骤6是人们通常会对该做什么感到困惑的地方. 但是,没有理由创建一个麻烦来解决这个问题. 相反,HTTP 可以按照 RFC 2616 所规定的方式使用,服务器回答:
409 Conflict 的状态代码是正确的使用,因为:
但是,相反是真的. 返回 303 只会是有意义的,如果多个创建请求(创建不同的资源)返回相同的内容. 一个例子将是一个“谢谢您提交您的请求消息”,客户不需要每次重新下载。
在恢复已经提到的风险下,似乎很重要的是要记住,PUT意味着客户端在创建资源时会控制什么URL。因此,PUT和POST之间的选择的一部分将是关于您可以信任客户端提供正确的,正常的URL,与您的URL计划是什么相一致。
当您无法完全信任客户端做正确的事情时,更适合使用 POST 创建一个新的项目,然后将 URL 返回客户端在回复中。
REST 是一个非常高级别的概念,事实上,它甚至没有提到 HTTP!
如果你有任何疑问如何在HTTP中实施REST,你总是可以看看原子出版协议(AtomPub)的规格. AtomPub是由许多HTTP和REST灯台开发的HTTP的RESTful网页服务的标准,其中一些来自Roy Fielding,REST的发明家和(共同)HTTP的发明家。
事实上,你甚至可以直接使用 AtomPub. 虽然它来自博客社区,它没有任何限制博客: 这是一个通用协议,以便通过 HTTP 与自愿的(自愿的)资源集合相互作用。
以下是 AtomPub 對資源創造的說法(第 9.2 節):
要将会员添加到集合中,客户将 POST 请求发送到集合的 URI。
被认为是不同的,在这个“PUT”,如“GET”被认为是无效的 - 也就是说,你可以要求相同的准确的PUT多次,结果将是像你执行它只有一次。
我将描述我认为最广泛使用和最有用的条约:
当你在一个特定的URL中找到一个资源时,发生的事情就是它应该在这个URL上存储,或者沿着这些行走。
例如,当你想创建一个新流时,你可以将其输入到某些URL,但是当你想向现有流发送一个消息时,你可以将其输入到URL。
至于修改流的属性,您可以使用 PUT 或 POST. 基本上,只使用“PUT”当操作是无效的 - 否则使用 POST。
但是,请注意,并不是所有现代浏览器都支持其他HTTP字母,而不是GET或POST。
POST 意思是“创建新”如在“这里是创建用户的输入,为我创建它”。
PUT 的意思是“输入,如果已经存在,取代”如“这里是用户数据5”。
您 POST 到 example.com/users 因为您还不知道用户的 URL,您希望服务器创建它。
您可以访问 example.com/users/id 因为您想要更换/创建一个特定的用户。
与相同数据两次发布意味着创建两个相同的用户与不同的ID。 与相同数据两次发布会创建用户的第一个,并更新到相同状态的第二次(没有变化)。 因为你结束相同状态后一个 PUT 无论你执行多少次,它被说是“平等强大”每次 - idempotent. 这是有用的自动退休