2013-12-11 31 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")); 

你看到鏈接在實體中而不在請求頭部。響應鏈接用於標題鏈接。您也可以製作更具體的對象,這只是使用地圖來獲取屬性數據。