gpt4 book ai didi

java - Resttemplate在接收响应之前如何确定响应的状态码?

转载 作者:行者123 更新时间:2023-12-02 01:35:35 24 4
gpt4 key购买 nike

我是 Java 新手,发现与 RestTemplate 相关的令人困惑的行为。

发生这种情况时,API 在相当慢的网络条件下返回了较大的正文(~5MB)。代码如下

ResponseEntity<MyEntity[]> result = restTemplate.exchange(url, HttpMethod.GET, entity, MyEntity[].class);

并且还设置了 ClientHttpRequestInterceptor 来在请求之前和之后进行日志记录。

令人困惑的是,请求后日志仅在远程服务器给出响应后一段时间才记录,并且可以在日志中打印HTTP状态代码

但是上面的语句花了更多的时间才最终接收到数据。查看线程堆栈内部,它正在从套接字读取数据。

我还查看了resttemplate类并发现:

response = request.execute();
handleResponse(url, method, response);
if (responseExtractor != null) {
return responseExtractor.extractData(response);
}

似乎是在execute()之后提取数据。

我的疑问是:

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

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

最佳答案

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

客户端可以知道状态代码是什么,因为使用 HTTP,您可以在响应正文之前先获取 header 和状态代码。但这对于 RestTemplate 来说并不重要,因为它 promise 最终为您提供 ResponseEntity 的对象,其中包含 http 响应中的所有内容,无论是状态 Codex header 还是正文。

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

关于java - Resttemplate在接收响应之前如何确定响应的状态码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57521851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com