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

问题描述 投票:30回答:5

由于PUT是幂等的,[[不应该PUT用于Create,<< POST不用于Update

这样,同一订单的多个PUT将只下一个订单?
api rest post put
5个回答
58
投票
不同之处在于,PUT用于已知资源,因此用于更新rfc2616中的as stated here

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

但是,我确实根据名称本身看到了您来自哪里。

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

我相信命名法可以追溯到很久以前,请考虑一下早期的网络。可能需要将其消息POST发送到留言板,然后再将PUT其他内容添加到其消息中。


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

A PUT请求要求服务器用随附的表示形式替换给定URI中的所有内容,而完全忽略当前内容。一个很好的类比是shell中的mv命令。如果该文件不存在,它将在目标位置创建新文件,或替换现有文件。无论哪种情况,它都完全忽略其中的任何内容。您可以使用它来创建,也可以更新某些内容,只要您发送完整的表示即可。

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

因此,您可以根据实际情况将其用于创建和更新,但是对于PUT,您必须对API中的所有内容都具有一致的语义,并且不能进行部分更新;而对于POST,您可以只要您记录其工作原理,就可以做任何您想做的事情。


6
投票
PUT应该用于且仅当客户端知道新资源的URI时才使用。服务可以在资源表示中通告新的URI。例如,服务可以提供某种形式的提交表单并在其上指定操作URI,它可以是新资源的预填充URI。在这种情况下,是的,如果初始PUT请求成功创建了资源,则在PUT请求之后只会替换它。

使用POST进行更新是可以的,从来没有说过POST仅用于“创建”操作。


0
投票
取决于您可以同时创建/更新站点/记录。当客户端指定URI时,则使用PUT。例如像Dreamweaver这样的任何代码编辑器,PUT都是使用的正确协议。

也查看此线程:put vs post in rest


0
投票
您正在尝试将CRUD与HTTP相关联,但这不起作用。 HTTP的原理不同,并且

not本身与CRUD相对应。混乱是由于REST而引起的; does对应于CRUD。 REST使用HTTP,但是在允许的内容上有其他限制。我已经准备好此问答,以解释HTTP处理方法:

正在请求什么?

    POST请求
  • 对收集的操作
A PUT请求将
  • 资源的放置
  • 放入集合中。 URI中命名了哪种对象?

      POST的URI标识
    • 集合
    PUT的URI标识
  • 资源
  • (在集合内)。如何分别在POSTPUT的URI中指定对象?

    /collectionId /collectionId/resourceId

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

      使用POST
    • 集合
    处于控制状态。使用PUT
  • 请求者
  • 受控制(除非请求失败)。HTTP协议能保证什么?

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

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

      POST
    • 通常不是
    等幂。 (服务器可以提供它希望的任何合同,但是幂等性通常不属于该合同)。 A PUT
  • 必需
  • ”是幂等的。 (所标识资源的状态是幂等的。允许该资源之外的副作用。)这是RFC:https://tools.ietf.org/html/rfc7231#section-4.3.3
    © www.soinside.com 2019 - 2024. All rights reserved.