【问题标题】:RESTful url: PUT or POST for a single recordRESTful url:对单个记录进行 PUT 或 POST
【发布时间】:2014-05-16 05:23:43
【问题描述】:

我了解 PUT(更新)和 POST(创建)之间的区别。我正在使用 Laravel。 我想知道的是您将在下面的示例中使用什么:

domain.com/users/1/reports

我正在获取用户 1 的所有报告。每个用户只会有 1 个报告。 因此,如果用户 1 想要查看该报告,它将是:

GET domain.com/users/1/reports

现在我应该使用 PUT 还是 POST 来更新该报告。 PUT 需要一个我认为没有必要的 ID,因为他们只会有 1 份报告,例如:

PUT domain.com/users/1/report/12

所以我的想法是只使用 POST 以便域名更干净

POST domain.com/users/1/report 

【问题讨论】:

    标签: api rest laravel restful-url


    【解决方案1】:

    一般来说,PUT 请求用于更新现有记录,POST 用于创建新记录。 POST 也可用于更新,但这取决于您要遵守多少约定。

    所使用的http方法实际上对所请求资源的确切性质没有任何意义,只是GET用于读取,PUTPOSTPATCHDELETE用于写入。

    如果只有一份报告,则无需在 uri 中提供 id,因此/users/{id}/report 就足够了。然后,您可以像这样访问报告:

    $user = User::with('report')->find($id);
    $report = $user->report;
    

    这意味着您必须覆盖 laravel 使用的默认路由方法,但作为最佳实践,您应该养成定义所有路由的习惯,而不是依赖 laravel 默认值。

    【讨论】:

      【解决方案2】:

      如果有can be only one report,则应将其检索为GET domain.com/users/1/report,并更新该路由PUT domain.com/users/1/report

      PUTmethod does not require an ID of the entity 如果只能有一个。我会坚持这一点,因为它保持PUT 幂等。

      POST方法不是幂等的,即POST在同一条路由上多次使用相同的参数会产生不同的结果,就像为这个用户创建多个报告一样。

      幂等性是理解PUTPOST的好方法。

      【讨论】:

      • 在 Laravel PUT 中需要一个 ID laravel.com/docs/controllers#resource-controllers。我该如何解决?
      • 这并不意味着您不能在routes.php 中覆盖它。 Laravel 中的资源控制器是减少写作的帮手,而不是一个不变的、完整的经验法则系统。
      • @user742736 如果我理解正确,默认情况下不需要{resource} 参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多