Jersey REST客户端在前面的响应中返回URI之后

Jersey REST客户端在前面的响应中返回URI之后,jersey,jersey-2.0,jersey-client,Jersey,Jersey 2.0,Jersey Client,我正在使用Jersey客户端API(2.0)与web服务交互。其中一个调用生成一个json对象,该对象具有“next”值。该值指向我们应该查询的资源,以获取长列表中的下一组项 { "results":[.....] "next":"/path/to/next/resource?someparam=someval&etc" } 我想知道是否有一个干净的方法来定位这个新的URL。。。是的,我可以解析URL以获取其中的查询部分,然后分解每个参数,然后反转过程以配置WebTarget,

我正在使用Jersey客户端API(2.0)与web服务交互。其中一个调用生成一个json对象,该对象具有“next”值。该值指向我们应该查询的资源,以获取长列表中的下一组项

{
  "results":[.....]
  "next":"/path/to/next/resource?someparam=someval&etc"
}
我想知道是否有一个干净的方法来定位这个新的URL。。。是的,我可以解析URL以获取其中的查询部分,然后分解每个参数,然后反转过程以配置WebTarget,但鉴于我已经获得了需要点击的URL,这似乎需要做很多额外的工作

我尝试将上述内容传递到path()方法中,但b/c JerseyWebTarget对路径编码无效

如果重要的话,我还是希望继承过滤器/等等。。。从源WebTarget

所以我在找这样的东西:

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=nextur.indexOf('?');
int-pathLen=qPos>=0?qPos:nextUrl.length();
WebTarget nextTarget=rootWebTarget.path(nextUrl.substring(0,pathLen));
如果(qPos>0){
多值映射参数=UriComponent.decodeQuery(nextur.substring(qPos+1),true);
对于(Map.Entry:params.entrySet()){
nextTarget=nextTarget.queryParam(entry.getKey(),entry.getValue().toArray());
}
}

对于这些类型的应用程序,我通常会保留一个指向根资源的WebTarget实例,然后使用
root.path(“my/app/path”).request()构建实际的端点调用。
。如果您这样做了,您就可以简单地重用base
root
目标来获得下一个结果。@Baldy是的-这就是我正在做的。问题是当“下一个”URL包含查询参数时,如何点击它。据我所知,传递给path()的值不能包含查询参数b/c Jersey将对?等等,明白了。我错过了问题的那一部分。您应该能够这样做:
root.getUriBuilder().path(“带参数的路径”).build()
并使用它从客户端获取新的
WebTarget
client.target(myUri)”。我还没有尝试过,但应该可以,因为你的
root`已经包含了基本URI。@Baldy我开始沿着这条路径,然后意识到过滤器/etc。。。在我的基本目标上配置不会继续。。。我要在上面再加一点面条。谢谢
    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());
        }

    }