1

对于我的工作,我必须公开一个能够从多个数据源收集数据的 API。这就是我必须使用 teiid 实现一些数据虚拟化的原因:由于我一个人在这个项目上,设计所有类以匹配每个 json 对象将是浪费时间。

看来我的一些数据源是分页的 REST Api。我知道 teiid 可以轻松处理 REST Api,但是那些分页的呢?

响应类似于:

{
  "total": 132,
  "subtotal": 132,
  "page": 2,
  "per_page": 100,
  "search": null,
  "sort": {
    "by": null,
    "order": null
  },
  "results": [ ... ]
}

我已经有一个 java 类,它可以通过使用如下所示的 do..while 循环来解析整个 API:

page = 1;
List<String> result = new ArrayList<String>();
do {
    RestTemplate template = new RestTemplate();
    HttpHeaders headers = createHttpHeaders();
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    ResponseEntity<String> request = template.exchange(url+endpoint+"?page=" + page, HttpMethod.GET, entity, String.class);
    ObjectMapper mapper = new ObjectMapper();
    SatelliteResponseJSON response;
    try {
        response = mapper.readValue(request.getBody().getBytes(), SatelliteResponseJSON.class);
        total = response.getTotal();
        parsed += response.getPer_page();
        page += 1;
        result.addAll(response.getResults());
    } catch (IOException e) {
        e.printStackTrace();
    }while (parsed < total);

有没有办法为我的 VDB 做同样的事情,所以我不必为我要工作的每种对象编写一个 java 类?如果没有,我怎么能避免编写这样的课程?

谢谢

4

1 回答 1

1

不幸的是,目前没有内置支持,因为 REST API 上的分页将根据给定的源进行自定义,并且很难从给定的原始页面中找出下一页的“nextURL”。

但是,您应该能够在 Teiid 代码中扩展“ws”转换器并轻松提供该功能,特别是如果您的所有源都遵循相同的分页结构。如果您可以通用地考虑此功能并有想法,我不介意接受作为贡献或合作开发此功能。

顺便说一句,我们支持的 OData 转换器确实具有分页功能,如果您的来源是 OData,这将无缝工作。您可以将其作为示例进行查看,但实际上并不是必需的。

于 2017-11-12T22:20:50.050 回答