[英]How to set up RestTemplate to retry calls on certain response status code?
[英]How does Resttemplate determine the status code of response before receiving it?
我是Java新手,發現與RestTemplate相關的令人困惑的行為。
發生這種情況的原因是,API在相當慢的網絡條件下返回了較大的正文(約5MB)。 代碼如下
ResponseEntity<MyEntity[]> result = restTemplate.exchange(url, HttpMethod.GET, entity, MyEntity[].class);
還將ClientHttpRequestInterceptor
設置為在請求之前和之后進行記錄。
令人困惑的是,在遠程服務器給出響應之后,僅在一段時間后才記錄請求后日志,並且可以在日志中打印HTTP Status code
。
但是上述聲明花費了更多時間才能最終接收到數據。 查看線程堆棧內部,它是從套接字讀取數據。
我還查看了resttemplate類,發現:
response = request.execute();
handleResponse(url, method, response);
if (responseExtractor != null) {
return responseExtractor.extractData(response);
}
似乎在execute()之后是extractData。
我的疑問是:
即使在獲取所有數據之前,客戶端如何知道狀態碼? 它只是從頂部數據包中提取必要的字段?
由於服務器已經發出了響應,在此過程中響應數據存儲在哪里?
它將從底層HTTP接收的數據存儲在內存中。
客戶端可以知道什么是狀態碼,因為使用HTTP,您首先需要在響應正文之前獲取標頭和狀態碼。 但這與RestTemplate無關緊要,因為它承諾最終會給您一個ResponseEntity對象,其中包含http響應中的所有內容,無論是狀態碼頭還是正文。
RestTemplate是HttpClient的抽象,大多數客戶端為您提供了為單獨的事件(如onHeadersReceived(),onStatusReceived()等)實現回調的選項。但是,如果您使用RestTemplate,則這意味着您不需要這種細粒度的控件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.