【问题标题】:Which Rest Method should be used for the creation of child应该使用哪种休息方法来创建孩子
【发布时间】:2019-09-17 05:31:20
【问题描述】:

在我的代码中,实体之间存在父子关系。现在我必须编写 Rest API 来创建一个孩子。

我对 POST 和 PUT 方法感到困惑。如果我要查看 master ,它就像 master 中的更新,所以我必须使用 PUT 方法。如果我要研究孩子,那就像是创造了一个新孩子。

代码:

@PostMapping("/master/{masterId}/child/{childId}")
public ResponseEntity<Void> insertChildDetail(

我正在使用 POST 方法,但我不确定。

能否请您告诉我哪种方法更好用以及为什么,以便我更好地理解。

【问题讨论】:

  • 根据规范,POST 用于创建新资源,PUT 用于更新现有资源。更多PUT vs. POST in REST
  • @SudhirOjha 这不太对...您应该阅读上面链接的问题的答案。也看看我的answerPOSTPUT 方法都可以用于创建资源。
  • @cossiomolin 你的回答对每个得到你回答的人都非常有帮助,我也是其中之一。是的,我在我的 cmets 中提供了一个链接,其中包含比我的评论更多的细节。我通常使用 POST 创建新资源,使用 PUT 更新现有资源。这就是为什么我发表评论而不是作为答案。

标签: java spring rest http


【解决方案1】:

POSTPUT 方法都可以用来创建资源。如果您的应用程序代表客户端生成资源标识符,那么您应该使用POST 而不是PUT 来创建资源。

为了支持它,我在下面引用了PUT 方法定义的一些部分(重点是我的):

4.3.4. PUT

PUT 方法请求创建目标资源的状态或将其替换为请求消息负载中包含的表示定义的状态。 [...]

如果目标资源没有当前表示并且PUT 成功创建了一个,那么源服务器必须通过发送201(已创建)响应来通知用户代理。如果目标资源确实有当前表示并且该表示已根据封闭表示的状态成功修改,则源服务器必须发送200(OK)或204(无内容)响应到表示请求成功完成。 [...]

PUT 请求的正确解释假定用户代理知道需要哪个目标资源。 代表客户端选择适当 URI 的服务,在收到状态更改请求后,应该使用 POST 方法而不是 PUT 来实现。 [...]

现在,在下面找到POST 方法定义的一些相关引用:

4.3.3. POST

POST 方法请求目标资源根据资源自己的特定语义处理请求中包含的表示。例如,POST 用于以下功能(以及其他功能):

[...]

  • 创建尚未被源服务器识别的新资源;

[...]

如果由于成功处理POST 请求而在源服务器上创建了一个或多个资源,则源服务器应该发送包含Location 头字段的201(已创建)响应,该字段提供创建的主要资源的标识符以及在引用新资源时描述请求状态的表示。

虽然201 状态码表示已创建新资源,但Location 标头表示新创建的资源所在的位置。如果没有提供Location 标头,则客户端应假定资源由有效请求 URI 标识:

6.3.2. 201 Created

201(已创建)状态代码表示请求已完成,并导致创建了一个或多个新资源。请求创建的主要资源由响应中的Location 标头字段标识,如果没有收到Location 字段,则由有效请求URI 标识。 [...]

【讨论】:

  • 能否请您解释一下“代表客户端选择适当 URI 的服务”这句话
【解决方案2】:

PUT 从父对象的角度来看会更有意义。

Parent -> Child

由于父对象已经存在,子对象是父对象的更新。 所以,我会说PUT 会更合适。

POST -> create
PUT -> create/update

【讨论】:

    【解决方案3】:

    这取决于场景。恕我直言,创建比更新优先级更高。所以POST 方法比PUT 方法更标准。

    【讨论】:

    • 需要更多解释。
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多