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

How can I parse a paginated REST API as a teiid datasource?

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

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

响应类似于:

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

我已经有一个 java class 可以通过使用 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 class 了吗?如果不是,我怎么能避免写这样的 classes?

谢谢

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

但是,您应该能够在 Teiid 代码中扩展 "ws" 翻译器并轻松提供该功能,尤其是当您的所有源都遵循相同的分页结构时。如果您可以概括地考虑此功能并有想法,我不介意接受贡献或协作开发此功能。

顺便说一句,我们支持的 OData 翻译器确实具有分页功能,如果您的源是 OData,这将无缝工作。你可以看看这个例子,但不是真的需要。