【问题标题】:How does Resttemplate determine the status code of response before receiving it?Resttemplate 在收到响应之前如何判断响应的状态码?
【发布时间】: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。

我的疑问是:

  1. 客户端如何在获取所有数据之前就知道状态码?它只是从顶部数据包中提取必要的字段?

  2. 既然服务器已经发出了响应,那么在这个过程中响应数据存放在哪里?

【问题讨论】:

    标签: java spring http server resttemplate


    【解决方案1】:

    它将从底层 HTTP 接收到的数据存储在内存中。

    客户端可以知道状态码是什么,因为使用 HTTP,您首先会在响应正文之前获取标头和状态码。但这与 RestTemplate 无关,因为它承诺最终会为您提供一个 ResponseEntity 对象,该对象包含来自 http 响应的所有内容,无论是状态码标头还是正文。

    RestTemplate 是对 HttpClient 的抽象,大多数客户端都为您提供了为 onHeadersReceived()、onStatusReceived() 等单独事件实现回调的选项。但如果您使用的是 RestTemplate,这意味着您不需要如此细粒度的控制.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多