簡體   English   中英

Resttemplate如何在收到響應之前確定響應的狀態碼?

[英]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。

我的疑問是:

  1. 即使在獲取所有數據之前,客戶端如何知道狀態碼? 它只是從頂部數據包中提取必要的字段?

  2. 由於服務器已經發出了響應,在此過程中響應數據存儲在哪里?

它將從底層HTTP接收的數據存儲在內存中。

客戶端可以知道什么是狀態碼,因為使用HTTP,您首先需要在響應正文之前獲取標頭和狀態碼。 但這與RestTemplate無關緊要,因為它承諾最終會給您一個ResponseEntity對象,其中包含http響應中的所有內容,無論是狀態碼頭還是正文。

RestTemplate是HttpClient的抽象,大多數客戶端為您提供了為單獨的事件(如onHeadersReceived(),onStatusReceived()等)實現回調的選項。但是,如果您使用RestTemplate,則這意味着您不需要這種細粒度的控件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM