2013-12-11 30 views
0

编辑较短的版本泽西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"); 

上述命令只是selfnull结束。

编辑完

我已经尽我所能找到解决这个但至今没有运气。

基本上我正在使用默认返回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); 

..不以nullentity工作和成果。

+0

这是来自GET还是POST请求?我怀疑你正在将Response中的链接与实际返回的实体中的链接混合在一起。你可以显示服务器端代码吗?有时服务器会返回带有JSON返回链接的Hateoas对象。这与Response对象中的链接不同(取决于格式)。 –

+0

这是一个HTTP GET请求。至于服务器端代码,恐怕我无法提供它,因为它是特定于供应商的实现,而我没有这些源代码。 然而,正如你所说,“有时服务器将返回一个带有JSON返回链接的Hateoas对象”:这正是我想要处理的情况。我只是无法使用球衣api getLink(“rel”)/ getLinks()方法获得这些讨厌的链接。 –

+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")); 

你看到链接在实体中而不在请求头部。响应链接用于标题链接。您也可以制作更具体的对象,这只是使用地图来获取属性数据。