使用REST API检索具有相关实体的实体

时间:2011-07-07 14:37:16

标签: rest stax

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

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)来阻止将所有实体加载到内存中?
  3. 非常感谢。

2 个答案:

答案 0 :(得分: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}

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

答案 1 :(得分:1)

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

重要

这里的资源是汽车。门的数量是一个属性,因此可以通过一些合理的方式来表达您的查询,从而围绕Car资源对您的系统进行建模。

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

  

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

请记住,REST的关键方面是每个资源都有一个URL。 REST没有说明URL是如何形成的,所以不要担心RAILs风格的嵌套资源。在Fielding自己的话中......

  

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