我正在使用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());
}
}