讀取響應
Response
對象由同步performRequest
方法返回或作爲ResponseListener#onSuccess(Response)
中的參數接收,它包裝http
客戶端返回的響應對象並公開一些其他信息。
Response response = restClient.performRequest(new Request("GET", "/"));
RequestLine requestLine = response.getRequestLine();
HttpHost host = response.getHost();
int statusCode = response.getStatusLine().getStatusCode();
Header[] headers = response.getHeaders();
String responseBody = EntityUtils.toString(response.getEntity());
-
response.getRequestLine()
— 有關執行的請求的信息。 -
response.getHost()
— 返回響應的主機。 -
response.getStatusLine()
— 響應狀態行,你可以從中檢索狀態代碼。 -
response.getHeaders()
— 響應頭,也可以通過getHeader(String)
按名稱檢索。 -
response.getEntity()
— 響應體包含在org.apache.http.HttpEntity對象中。
執行請求時,會拋出異常(或在以下方案中作爲ResponseListener#onFailure(Exception)
中的參數接收:
IOException
- 通信問題(例如
SocketTimeoutException
)
ResponseException
- 返回了一個響應,但其狀態代碼表示錯誤(不是
2xx
),ResponseException
源自有效的http
響應,因此它公開其相應的Response
對象,該對象提供對返回的響應的訪問。
對於返回404
狀態碼的HEAD
請求,不會拋出ResponseException
,因爲它是一個預期的HEAD
響應,僅表示找不到該資源。除非ignore
參數包含404
,否則所有其他HTTP
方法(例如,GET
)都會爲404
響應拋出ResponseException
。ignore
是一個特殊的客戶端參數,不會發送到Elasticsearch幷包含逗號分隔的錯誤狀態代碼列表,它允許控制是否應將某些錯誤狀態碼視爲預期響應而不是異常。這對於例如get
api很有用,因爲它可以在文檔丟失時返回404
,在這種情況下,響應正文將不包含錯誤,而是通常的get
api響應,只是沒有找到未找到的文檔。
請注意,低級別客戶端不會公開任何json
編組和反編組的輔助程序,用戶可以自由地使用他們喜歡的庫。
底層的Apache Async Http Client附帶了不同的org.apache.http.HttpEntity實現,允許以不同的格式提供請求體(流、字節數組、字符串等),至於讀取響應體,HttpEntity#getContent
方法很方便,它返回從先前緩衝的響應體讀取的InputStream
,作爲替代方案,可以提供自定義org.apache.http.nio.protocol.HttpAsyncResponseConsumer來控制字節的讀取和緩衝方式。
日誌記錄
Java REST客戶端使用Apache Async Http Client使用的相同日誌庫:Apache Commons Logging,它支持許多流行的日誌記錄實現,啓用日誌記錄的java包是客戶端本身的org.elasticsearch.client
和嗅探器的org.elasticsearch.client.sniffer
。
還可以啓用請求跟蹤器日誌記錄,以便以curl
格式記錄每個請求和相應的響應,這在調試時很方便,例如,如果需要手動執行請求以檢查它是否仍然產生與它相同的響應,爲tracer
包啓用跟蹤日誌記錄以打印出此類日誌行,請注意,此類日誌記錄開銷很大,不應在生產環境中始終啓用,而是僅在需要時暫時使用。