泽西REST客户端跟随先前响应中返回的URI

时间:2014-08-11 13:48:16

标签: jersey jersey-2.0 jersey-client

我正在使用Jersey Client API(2.0)与Web服务进行交互。其中一个调用导致json对象具有“下一个”值。该值指向我们应该查询以获取长列表中的下一组项目的资源。

{
  "results":[.....]
  "next":"/path/to/next/resource?someparam=someval&etc"
}

我想知道是否有一种干净的方法来定位这个新URL ...是的,我可以解析URL以获取它的查询部分,然后拆分每个参数然后反转过程以配置WebTarget ,但这似乎是很多额外的工作,因为我已经有了我需要的URL。

我已尝试将上述内容传递给path()方法,但这不起作用b / c JerseyWebTarget对路径进行编码。

如果重要,我确实还想从源WebTarget继承过滤器/ etc ....

所以我正在寻找这样的东西:

WebTarget source = ....;
ListResult listResult = source.request().get();
display(listResult);
while (listResult.hasNext()){
  listResult = source.path(listResult.getNextUrl()).request().get();
  display(listResult);  
}

但是path()调用允许传递完整的相对URL ......

编辑 - 添加示例:

作为参考,以下是我必须做的工作(如果URL不仅包含相对路径和查询参数字符串,它将会中断):

    String nextUrl = previous.getNextUrl();
    int qPos = nextUrl.indexOf('?');
    int pathLen = qPos >= 0 ? qPos : nextUrl.length();

    WebTarget nextTarget = rootWebTarget.path(nextUrl.substring(0, pathLen));
    if (qPos > 0){
        MultivaluedMap<String, String> params = UriComponent.decodeQuery(nextUrl.substring(qPos+1), true);

        for(Map.Entry<String, List<String>> entry : params.entrySet()){
            nextTarget = nextTarget.queryParam(entry.getKey(), entry.getValue().toArray());
        }

    }

0 个答案:

没有答案