背景信息分析:
根据 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、旧浏览器、防火墙等支持。
步骤6是人们通常会对该做什么感到困惑的地方. 但是,没有理由创建一个麻烦来解决这个问题. 相反,HTTP 可以按照 RFC 2616 所规定的方式使用,服务器回答:
409 Conflict 的状态代码是正确的使用,因为:
但是,相反是真的. 返回 303 只会是有意义的,如果多个创建请求(创建不同的资源)返回相同的内容. 一个例子将是一个“谢谢您提交您的请求消息”,客户不需要每次重新下载。
在很简单的方式,我正在采取Facebook时间线的例子。
案例1:当你在时间表上发布某些东西时,这是一个新鲜的新输入,所以在这种情况下,他们使用POST方法,因为POST方法是无效的。
案例2:如果你的朋友第一次评论你的帖子,它也会在数据库中创建一个新的帖子,以便使用POST方法。
案例3:如果你的朋友编辑他的评论,在这种情况下,他们有一个评论 ID,所以他们将更新一个现有评论而不是创建一个新的数据库输入。
在单行中,使用 POST 在数据库中添加一个新的输入和 PUT 在数据库中更新一些东西。
最重要的考虑是可靠性. 如果一个 POST 消息丢失,系统的状态是不确定的. 自动恢复是不可能的. 对于 PUT 消息,状态是不确定的,直到第一次成功退出。
例如,使用 POST 创建信用卡交易可能不是一个好主意。
如果您在您的资源上有自动创建的 URI,您仍然可以使用 PUT 通过向客户端传输一个创建的 URI(指向一个空的资源)。
其他一些考虑:
POST 取消了所有包含资源的隐藏副本(更好的一致性) PUT 回复是不可隐藏的,而 POST 回复是(要求内容位置和终止) PUT 是不受 Java ME、旧浏览器、防火墙等支持。
REST 是一个非常高级别的概念,事实上,它甚至没有提到 HTTP!
如果你有任何疑问如何在HTTP中实施REST,你总是可以看看原子出版协议(AtomPub)的规格. AtomPub是由许多HTTP和REST灯台开发的HTTP的RESTful网页服务的标准,其中一些来自Roy Fielding,REST的发明家和(共同)HTTP的发明家。
事实上,你甚至可以直接使用 AtomPub. 虽然它来自博客社区,它没有任何限制博客: 这是一个通用协议,以便通过 HTTP 与自愿的(自愿的)资源集合相互作用。
以下是 AtomPub 對資源創造的說法(第 9.2 節):
要将会员添加到集合中,客户将 POST 请求发送到集合的 URI。