1

我们正在使用 REST API 在我们的客户端 (UI) 和服务器之间进行通信。我们已经实现了一种资源的分页获取,例如:

GET http://../cars?page-size=10,start-index=3

从 21 号车(即 10 辆汽车的第 3 页)开始,将返回您最多 10 辆汽车。

我们希望添加一种返回具有相关实体的实体的可能性,其中一个主要实体可以有许多相关实体(可能是几十个或几百个)。目前这是使用 2 个请求完成的:例如,首先对汽车进行 GET,然后使用先前获取的汽车 ID 作为参数对门进行 GET:

GET http://../doors?car-ids=1,2,5,7,...

但是,为了尽量减少请求的数量,我们希望使用 1 个请求来返回所需的信息。出现以下问题:

  1. 分页应该如何与这样的功能集成?相关实体编号(门)是否应限制在主要实体(汽车)的页面大小?也许我们应该分开主要实体和相关实体的页面大小(例如 10 辆汽车,每辆汽车最多 2 个门)?
  2. 我们如何确保解决方案在内存使用方面在服务器端具有可扩展性?目前我们使用 JAXB 将实体序列化为 XML。我们是否应该考虑使用流式 XML 技术 (STAX) 来防止将所有实体加载到内存中?

非常感谢。

4

2 回答 2

1

关于问题1:

我会创建一个快照资源,它返回资源实体本身以及所有相关实体: GET /car/{car-id}/snapshot 知道这将返回一个带有可能很大的响应实体的快照,可以返回一个相当大的、非分页的子实体列表(即门)。但是,您可能会限制客户端可以针对此成本较高的快照资源调度的请求数量。您甚至可以为批处理请求提供资源,例如/cars/snapshots,您可以在其中POST一次检索多个汽车 ID 并检索多个快照(在这种情况下,我也会限制要包含在批处理请求中的 ID 数量)。

另一方面,我创建一个带有子实体的分页列表:GET /car/{car-id}/doors(303 到第一页)和 GET /car/{car-id}/door/{door-id as cursor}每一页。

这将允许客户选择最适合他们使用的表示,或者遍历列出的所有门,或者获取汽车的完整快照,如果客户仍然需要它。

于 2011-07-07T14:51:08.903 回答
1

我认为这里的 REST 问题不如 OO 分析重要

这里的资源是汽车。门的数量是一个属性,因此请围绕 Car 资源建模您的系统,并使用一些合理的方式来表达您的查询。

最不令人惊讶(因此可能是最好的)方法是添加到现有的汽车查询中。以你为例:

获取 http://../cars?doors=2+,page-size=10,start-index=3

请记住,REST 的关键方面是每个资源都有一个 URL。REST 没有说明 URL 是如何形成的,所以不用担心 RAIL 样式的嵌套资源。用菲尔丁自己的话来说......

重要的是每个重要资源都有一个 URI,其中允许使用 GET 获取该资源的表示。

于 2011-07-07T14:51:28.607 回答