【问题标题】:Multiple records with one request in RESTful systemRESTful 系统中一个请求的多条记录
【发布时间】:2016-05-03 23:01:44
【问题描述】:

我看到的所有关于 RESTful 架构的示例都处理了一条记录。例如,对 mydomain.com/foo/53 的 GET 请求以获取 foo 53 或对 mydomain.com/foo 的 POST 请求以创建新的 Foo。

但是多条记录呢?能够通过 id 请求一系列 Foo 或发布一组新的 Foo 通常对于单个 API 请求而不是几十个单独的请求更有效。你会“重载”mydomain.com/foo 来处理单个或多个记录的请求吗?或者你会添加一个mydomain.com/foo-multiple 来处理多个 POST 和 GET 吗?

我正在设计一个可能需要一次获取许多记录的系统(类似于mydomain.com/foo/53,54,66,86,87)但由于我没有看到任何这样的例子,我想知道是否有一些我只是不了解使这种方法“错误”的 RESTful 架构。

【问题讨论】:

  • 我想知道的是,如果 53OK,但 54Not Found,你会怎么做。然后您应该返回部分列表还是什么都不返回?

标签: rest


【解决方案1】:

在单个请求中不返回多条记录是有充分理由的,因为它的缓存能力和可扩展性较差。每当您想知道 REST 应该如何工作或为什么工作时,请查看网页。当您请求一个页面时,它会包含指向其他资源的链接,例如多个图像、css 文件、js 文件等。

虽然尝试在单个请求中抽取所有这些似乎更有效,但将它们全部视为单独​​的资源并允许 Web 服务器和保持活动连接来处理使许多资源的高效请求。如果您将所有 css、javascript 和图像内联到可以代表整个页面的单个下载中,当您访问需要一些相同资源的另一个页面时,您必须重新下载它们,因为您没有正确引用它们作为一个单独的资源,浏览器第一次可以缓存。

当您确实有代表多个资源列表的内容时,最好的方法是让列表只是单个资源的 url 列表,并分别获取每个资源,就像说的那样闪烁的网页包含页面上所有图像的 url,它不会尝试将它们全部内联到页面本身。

当资源正确允许缓存并被单独引用时,缓存命中率会变得非常高,从而使 Web 服务器能够处理更多负载,并允许在客户端和服务器之间缓存代理服务器,以防止请求甚至不得不命中服务器。网络使用这种方法运行良好,在认为这听起来很疯狂之前,请考虑一下。

【讨论】:

    【解决方案2】:

    虽然我认为您的方法没有任何本质上的错误,但您的 API 用户想要具有任意 ID 的 foo 记录似乎有点奇怪。我会立即怀疑他们正在使用 ID 来表示不同的概念,例如,上周创建的所有 foos 等等。如果这是他们正在做的事情,那么您可能应该公开该功能在服务器上,而不是使用 ID 列表作为代理。

    【讨论】:

    • 是的,这是一个很好的建议。通常,会有一个“业务语义”可以用来使 N-items-recourse 更加自然。
    • 这是有道理的。您通常会将此类事情作为单独的操作提供吗,例如“/foo/since/2010-04-01”?
    • 我会把它作为一个单独的动作。
    【解决方案3】:

    这是一个古老的问题,但是,我写这篇文章是为任何可能在寻找答案时登陆这里的人写的。

    应用程序请求多个由 ID 指定的记录有很多正当理由,不,不需要任何逻辑,如“上周创建”或“在 Date1 和 Date2 之间创建”等。想象一个情况其中向用户显示了一个网格/记录列表,他们可以手动选择多个记录以进行进一步处理。

    话虽如此,这里已经提出了许多解决方案: How to construct a REST API that takes an array of id's for the resources

    但是,恕我直言,最好的解决方案是@nilesh 在同一讨论中提出的解决方案: https://stackoverflow.com/a/32436345/134120

    首先执行 POST 传递您想要获取的 ID,服务器将返回一个批次 ID,然后您使用该批次 ID 执行 GET 以获取所有记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      相关资源
      最近更新 更多