Jersey REST客户端在前面的响应中返回URI之后
我正在使用Jersey客户端API(2.0)与web服务交互。其中一个调用生成一个json对象,该对象具有“next”值。该值指向我们应该查询的资源,以获取长列表中的下一组项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,
{
"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()构建实际的端点调用。
。如果您这样做了,您就可以简单地重用baseroot
目标来获得下一个结果。@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());
}
}