编辑较短版本
好的,看看我自己的帖子,我发现这可能不是最简短的阅读内容,所以我想我会写一个更简洁的版本,附上一些更实际的细节。
我正在使用Jersey 2客户端框架对Documentum REST API进行编码,该API暂时托管在我的本地计算机上。如果我执行以下代码:
WebTarget target = client.target("http://localhost:8080/dctm-rest/repositories/repo");
Response response = t.request().get();
并且返回的XML看起来像这样
<?xml version="1.0" encoding="UTF-8"?>
<repository xmlns="http://identifiers.emc.com/vocab/documentum" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<... metadata entries></>
<links>
<link rel="self" href="http://localhost:8080/dctm-rest/repositories/repo"/>
<link rel="http://identifiers.emc.com/linkrel/users" href="http://localhost:8080/dctm-rest/repositories/darwin_test/users"/>
<... more links />
</links>
</repository>
...那么我需要做什么才能以下列方式获取响应中的链接:
Link self = response.getLink("self");
以上命令最终只有self
为null
。
结束编辑
我已经尽力找到解决方案但到目前为止没有运气。
基本上我正在使用一个REST Web服务,它默认返回JSON格式的资源,这非常好(不过很多比xml好)。我使用Jersey 2.4.1来使用服务,虽然我对REST服务进行编码很新,但除了这个之外我还没有任何实际问题(就我而言,这真的比REST更多与Jersey相关可以告诉)。
基本上,我没有运气使用Jersey 2 API来检索和遍历服务返回的链接。 Jersey 2在其文档中有以下(简短)示例:
// server side - adding links to a response:
Response r = Response.ok().
link("http://oracle.com", "parent").
link(new URI("http://jersey.java.net"), "framework").
build();
哪个imho是以下返回数据的等价物:
<link rel="parent" href="http://oracle.com"/>
<link rel="framework" href="http://jersey.java.net"/>
现在要获取这些关系的链接,文档中的客户端代码如下所示:
// client-side processing:
final Response response = target.request().get();
URI u = response.getLink("parent").getUri();
URI u = response.getLink("framework").getUri();
我认为这非常简单。现在我的服务,在我的WebTarget对象指向的URL中,有大约10个以下JSON格式的链接:
{
... <metadata before the links> ...
"links" :
[
{
"rel" : "some relation",
"href" : "some http url"
}
... about 10 more entries like this
]
}
问题在于,如果我对文档中的内容进行客户端等效:
WebTarget t = client.target("url");
t.request().get().getLinks();
..然后我回来了,只有空Set<Link>
。
我怀疑它可能与Client
以某种方式启用JSON绑定有关,但我尝试添加MOXy的依赖项,如果是的话,显然应该是自启用的在类路径中,这没有帮助。
我确信我错过了一些非常基本的东西,但我一整天都在搜索,测试不同媒体类型的请求和我能想到的任何东西,但没有运气。虽然我的应用程序在没有这种链接处理的情况下工作正常,但我仍然希望能够正常工作。
感谢您提供任何帮助。
// Andreas
编辑对用户1888440的回复
我同意,链接确实在查询资源时返回的实体中。这也符合我处理资源的方式,我在哪里使用:
JsonObject o = Json.createReader(target.request().get().readEntity(InputStream.class)).readObject();
..然后以下列方式查询对象的链接:我需要首先从JsonObject o获取“links”-JsonArray,然后遍历找到的所有链接,比较“rel”-description与我的内容然后返回正确的“href”值。
但是我认为应该有一种更平滑的方式来获取实体中的链接,特别是如果我们将此过程与以下内容进行比较:
response = target.request().get();
URI u = response.getLink("parent").getUri();
URI u = response.getLink("framework").getUri();
我得到你所说的,上面的getLink(“rel”)/ getLinks()方法仅适用于响应标题中的链接。但是肯定在实体内部必须有一些等效的处理链接的方法,这不像我上面描述的那样冗长吗?
PS:您建议的示例,将资源实体读入Map
:
Map entity = t.get( Map.class );
..不起作用,导致null
的{{1}}值。
答案 0 :(得分:0)
供应商向您发送嵌入在响应中的实体中的链接,而不是响应本身中的链接。试试这个:
Map entity = t.get( Map.class );
Map<String,String> links = (Map<String,String>)entity.get( "links );
URI uriSelf = URI.create( links.get( "self" ) );
您会看到实体中的链接不在请求的标头中。响应链接用于标题链接。您还可以创建一个更具体的对象,这只是使用map来获取属性数据。