编辑较短的版本泽西2个getLinks()返回空集,尽管链接的资源为
好了,所以看我自己的文章中,我意识到这也许不是读最短的事情,所以我想我会写一个更简洁的版本,并提供一些更实用的细节。
我正在使用Jersey 2客户端框架对Documentum REST API进行编码,该API暂时托管在本地计算机上。如果我执行下面的代码:
WebTarget target = client.target("http://localhost:8080/dctm-rest/repositories/repo");
Response response = t.request().get();
并返回这个样子的
<?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>
的XML ...那么我有什么,以获得在响应中的链接做方式如下:
Link self = response.getLink("self");
上述命令只是self
是null
结束。
编辑完
我已经尽我所能找到解决这个但至今没有运气。
基本上我正在使用默认返回JSON格式的资源的REST web服务,这非常不错(比xml好多了)。我使用Jersey 2.4.1来使用服务,虽然我对REST服务进行编码相当新颖,但除此之外,我还没有遇到任何实际问题(并且就I而言,这实际上比REST更具泽西相关性可以告诉)。
基本上,我无法利用Jersey 2 API检索和遍历由服务返回的链接。新泽西州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();
我觉得这很简单。现在我的服务,在URL中,我WebTarget对象所指向,在下列JSON格式大约10个链接:
{
... <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结合做的,但我已经尝试添加了莫西,这appearently应该是,如果它在classpath中启用了自我的依赖,而且没”帮助。
我确定我错过了一些非常基本的东西,但我一直在搜索整天,测试不同的媒体类型的请求和任何我能想到但没有运气的东西。虽然我的应用程序工作正常,没有这种链接处理,我仍然想要这个工作。
感谢您的任何帮助。
//安德烈亚斯
编辑响应user1888440
我同意,该链是在实体当资源被查询返回。
JsonObject o = Json.createReader(target.request().get().readEntity(InputStream.class)).readObject();
..然后查询对象为以下方式联系:我需要首先获得“链接” -JsonArray来自这也与我一直在处理资源,在这里我用的对齐方式JsonObject o,然后迭代找到的所有链接,比较“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
工作和成果。
这是来自GET还是POST请求?我怀疑你正在将Response中的链接与实际返回的实体中的链接混合在一起。你可以显示服务器端代码吗?有时服务器会返回带有JSON返回链接的Hateoas对象。这与Response对象中的链接不同(取决于格式)。 –
这是一个HTTP GET请求。至于服务器端代码,恐怕我无法提供它,因为它是特定于供应商的实现,而我没有这些源代码。 然而,正如你所说,“有时服务器将返回一个带有JSON返回链接的Hateoas对象”:这正是我想要处理的情况。我只是无法使用球衣api getLink(“rel”)/ getLinks()方法获得这些讨厌的链接。 –
是的,我认为供应商并没有在响应中放置链接,而是将它们放入实体中。 –