如何将分页的REST API解析为teiid数据源?

时间:2017-11-08 08:18:08

标签: java teiid

对于我的工作,我必须公开一个能够从多个数据源收集数据的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类?如果没有,我怎么能避免写这样的课?

由于

1 个答案:

答案 0 :(得分:1)

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

但是,您应该能够在Teiid代码中扩展“ws”转换器并轻松提供该功能,尤其是在所有源都遵循相同的分页结构的情况下。如果你能够想到这个特征并且有想法我不介意作为贡献接受或者合作发展。

BTW,我们支持的OData翻译器确实有分页功能,如果你的源代码是OData,这将无缝地工作。你可以看一下这个例子,但并不是真的需要。