2016-01-28 53 views
0

我使用Jersey 2.22來使用REST api。 該方法是契約優先,服務接口和包裝器用於調用REST api(使用org.glassfish.jersey.client.proxy包)。使用Jersey客戶端代理時訪問HTTP響應

WebClient webClient = ClientBuilder.newClient();
WebTarget webTarget = webClient.getWebTarget(endPoint);
ServiceClass proxy = WebResourceFactory.newResource(ServiceClass.class,webTarget);

Object returnedObject = proxy.serviceMethod(「id1」);

問題是:如何獲得底層的HTTP響應(HTTP狀態+正文)?
當returnedObject爲null時,我需要分析響應以獲取返回的錯誤消息。 有沒有辦法做到這一點?
我看到我們可以插入過濾器和攔截器來捕捉響應,但那不完全是我需要的。

+0

設置你的界面來返回'響應' –

+0

我很想,但我沒有控制這個接口。我不明白爲什麼這個球衣客戶端代理不允許訪問基礎響應。 – tigrou83

回答

0

作爲接口方法而不是普通DTO的結果,您應該返回Response

我不確定你期望的控制級別(考慮你對@peeskillet評論的回覆),但是Response對象會給你機會微調你服務器的響應(頭文件,cookies,狀態等) ),並在客戶端閱讀所有內容 - 您可能會看到Response的成員如getStatus()getHeaders()

這裏唯一的問題是如何得到身體。爲此,我會告訴您使用readEntity(Class<T>)(而不是像最初可能嘗試的那樣使用getEntity()方法)。只要你有正確的媒體類型提供者註冊,你可以簡單的方式提取實體作爲你的DTO類。

例如,如果你正在使用maven,球衣和JSON作爲介質類型,您可以添加以下的依賴(並採取提供商的註冊理所當然):

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
</dependency> 

然後,得到實體主體反序列化使用:

Response resp = proxy.serviceMethod("id1"); 
int status = resp.getStatus(); 
String statusText = resp.getStatusInfo(); 
String someHeader = resp.getHeaderString("SOME-HEADER"); 
YourCustomDTO obj = resp.readEntity(YourCustomDTO.class); 

查詢自定義對象列表(即方法返回JSON數組)時,使用數組類型來讀取正文。

Response resp = proxy.serviceMethodThatReturnsCollection(); 
YourCustomDTO[] obj = resp.readEntity(YourCustomDTO[].class); 

請注意閱讀體內後,流被關閉,並試圖getEntity()可能會拋出異常。

希望它有幫助。

相關問題