编辑较短的版本
好的,所以看着我自己的帖子,我意识到这可能不是读起来最短的东西,所以我想我会写一个更简洁的版本,里面有更多的动手细节。
我正在使用 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
上面的命令只是以be结束null
。
结束编辑
我已经尽力找到解决方案,但到目前为止还没有运气。
基本上我正在使用一个 REST Web 服务,它默认返回 JSON 格式的资源,这非常好(无论如何都比 xml 好很多)。我正在使用 Jersey 2.4.1 来使用该服务,虽然我对针对 REST 服务进行编码还很陌生,但除此之外我没有遇到任何真正的问题(就我而言,这确实比 REST 更与泽西岛相关可以告诉)。
基本上,我在使用 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();
哪个恕我直言是以下返回数据的等价物:
<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 的依赖项,如果它在类路径中,它似乎应该是自启用的,但这没有帮助。
我确定我错过了一些非常基本的东西,但我整天都在搜索,测试不同的媒体类型请求以及我能想到的任何东西,但没有运气。虽然我的应用程序在没有这种链接处理的情况下可以正常工作,但我仍然想让它正常工作。
感谢您对此的任何帮助。
// 安德烈亚斯
编辑对 user1888440 的响应
我同意,链接确实在查询资源时返回的实体中。这也与我处理资源的方式一致,我在其中使用:
JsonObject o = Json.createReader(target.request().get().readEntity(InputStream.class)).readObject();
..然后以以下方式查询对象的链接:我需要首先从 JsonObject o 中获取“链接”-JsonArray,然后遍历找到的所有链接,将“rel”描述与我所追求的进行比较并返回正确的“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
.entity