【发布时间】:2019-12-22 14:44:08
【问题描述】:
我是 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。
我的疑问是:
客户端如何在获取所有数据之前就知道状态码?它只是从顶部数据包中提取必要的字段?
既然服务器已经发出了响应,那么在这个过程中响应数据存放在哪里?
【问题讨论】:
标签: java spring http server resttemplate