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

时间:2012-06-04 17:02:31

标签: api rest post put

不应该 PUT 用于Create POST 用于Update,因为PUT是幂等的。

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

5 个答案:

答案 0 :(得分:52)

区别在于PUT用于已知资源,因此用于更新rfc2616中的as stated here

  

POST和PUT请求之间的根本区别在于   反映在Request-URI的不同含义中。一个中的URI   POST请求标识将处理随附的资源   实体。该资源可能是一个数据接受过程,一个网关   一些其他协议,或接受注释的单独实体。在   相反,PUT请求中的URI标识括起来的实体   请求 - 用户代理知道URI的意图和   服务器不得尝试将请求应用于其他资源。

但我确实根据名字本身确定了你来自哪里。

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

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

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

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

因此,根据具体情况,您可以同时使用它们进行创建和更新,但使用PUT时,您必须对API中的所有内容具有一致的语义,并且无法进行部分更新,并使用{{ 1}}你可以做任何你想做的事,只要你记录它的确切运作方式。

答案 3 :(得分:0)

这取决于...... 您可以使用两者创建/更新站点/记录。 当客户端指定URI时,PUT就是要走的路。 例如像Dreamweaver,PUT这样的代码编辑器是正确的协议。

还要看一下这个帖子:put vs post in rest

答案 4 :(得分:0)

您正在尝试将CRUD与HTTP相关联,但这不起作用。 HTTP的原理不同,本身与CRUD相对应。混乱是由于REST而引起的; 确实对应于CRUD。 REST使用HTTP,但是在允许的内容上有其他限制。我已经准备好此问答,以解释HTTP处理方法:

有什么要求?

  • POST请求对集合进行操作
  • PUT请求将资源放置到集合中。

在URI中命名什么样的对象?

  • POST的URI标识一个集合
  • PUT的URI标识资源(在集合内)。

如何在URI中分别为POSTPUT指定对象?

/collectionId
/collectionId/resourceId

HTTP协议赋予集合多少自由度?

  • 通过POST集合处于控制状态。
  • 使用PUT请求者处于控制状态(除非请求失败)。

HTTP协议能保证什么?

  • 使用POST时,HTTP协议没有定义集合应该发生的事情; rfc指出服务器应“ 根据[集合]自身的特定语义处理...请求。”(仅供参考:rfc使用混淆的短语“目标资源”来表示“集合” 。)由服务器决定合同,该合同定义POST的工作。
  • 使用PUT,HTTP协议要求响应“成功”,必须保证,该集合现在包含具有ID和请求所指定内容的资源。

该操作是否可以在集合中创建新资源?

  • ,还是否,取决于合同。如果合同是REST协议,则需要插入。 POST创建新资源时,响应为201。
  • ,但这意味着请求者正在指定新ID。这对于公告板很好,但是对数据库有问题。 (因此,对于数据库应用程序,PUT通常不会插入,而只会更新。)PUT创建新资源时,响应为201。

操作是幂等的吗?

  • POST通常不是幂等。 (服务器可以提供它希望的任何合同,但是幂等性通常不属于该合同)。
  • 要求必须PUT才能成为幂等。 (所标识资源的状态是幂等的。允许该资源之外的副作用。)

这是RFC: https://tools.ietf.org/html/rfc7231#section-4.3.3