REST - 不应该PUT =创建和POST =更新

Taw*_*ani 30 api rest post put

不应该使用PUTCreatePOST,Update因为PUT是幂等的.

这样,同一个订单的多个PUT只会放置一个订单?

JP *_*shy 54

不同之处在于PUT用于已知资源,因此用于更新, rfc2616中所述.

POST和PUT请求之间的根本区别体现在Request-URI的不同含义上.POST请求中的URI标识将处理所包含实体的资源.该资源可能是数据接受过程,某些其他协议的网关或接受注释的单独实体.相反,PUT请求中的URI标识请求附带的实体 - 用户代理知道URI的用途,并且服务器不得尝试将请求应用于其他资源.

然而,我确实根据名称来确定你来自哪里.

我通常会查看POST,因为它应该是处理我的请求内容的URI(在大多数情况下,params作为表单值),从而创建一个新资源,PUT作为我的请求主题的URI(/ users/1234),已经存在的资源.

我相信命名法可以追溯到很长一段时间,考虑早期的网络.有人可能希望将POST他们的消息发送到留言板,然后PUT在日后将其他内容添加到他们的消息中.

  • 为了扩展这一点,我认为将PUT视为"set"的同义词并将POST视为"create child of"的同义词可能会更清楚.我不会想到"创造"或"更新",因为它会给你错误的直觉. (10认同)
  • Martin Fowler说:"[有些人错误地在`POST` /`PUT`和`create` /`update`之间建立了对应关系](http://martinfowler.com/articles/richardsonMaturityModel.html)" (8认同)

Ped*_*eck 7

HTTP方法和CRUD之间没有严格的对应关系.这是一些框架采用的约定,但它与REST约束无关.

PUT请求要求服务器替换无论是在给定的URI与封闭表示,完全无视当前内容.一个很好的类比是mvshell中的命令.如果它不存在,它会在目标创建新文件,或者替换存在的任何文件.在任何一种情况下,它都完全忽略了那里的任何东西.只要您发送完整的表示,您就可以使用它来创建,也可以使用它来更新内容.

POST要求目标资源根据预定义的规则处理有效负载,因此它是用于任何尚未通过HTTP协议标准化的操作的方法.这意味着POST你可以做任何你想做的事情,只要你没有从其他方法复制功能 - 例如,POST当你应该使用时进行检索GET- 并且你正确地记录它.

因此,根据具体情况,您可以同时使用它们进行创建和更新,但是PUT您必须对API中的所有内容具有一致的语义,并且您无法进行部分更新,并且POST您可以执行任何您想要的操作,只要你记录它是如何工作的.


ios*_*seb 6

当且仅当客户端知道新资源的可能URI时,才应将PUT用于创建.新URI可以由服务在资源表示中公布.例如,服务可以提供某种提交形式并在其上指定动作URI,其可以是新资源的预先填充的URI.在这种情况下是,如果初始PUT请求成功创建资源,则PUT请求将仅替换它.

可以使用POST进行更新,但从未说POST仅用于"创建"操作.