RestTemplate实时接收Chunked编码传输的HTTP Response

学习调用AI接口的时候,流式响应都是使用的 Transfer-Encoding: chunked,图方便想用RestTemplate,但是平时用到的都是直接返回响应对象的类型。使用bing搜索到一种方式,使用下面的代码来读取,于是掉这个坑里了,浪费了我好长时间。

java 复制代码
ResponseEntity<Resource> responseEntity = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, org.springframework.core.io.Resource.class);
PrintWriter writer = httpServletResponse.getWriter();
BufferedReader bufferedReader;
try {
    bufferedReader = new BufferedReader(new InputStreamReader(responseEntity.getBody().getInputStream()));
    String line;
    while ((line = bufferedReader.readLine()) != null && !(ChatGpt3dot5Request.STREAM_MESSAGE_PREFIX + "[DONE]").equals(line)) {
        String message = getMessageFromLine(line, ChatGpt3dot5Request.STREAM_MESSAGE_PREFIX);
        writer.write(message);
        writer.flush();
    }
} catch (IOException e) {
    throw new RuntimeException(e);
}

注意,上面的代码是错误的,并不会实时读取到数据,而是会等到响应全结束之后才能读取到数据。


下面的才是正解:

java 复制代码
restTemplate.execute(apiUrl, HttpMethod.POST, restTemplate.httpEntityCallback(requestEntity), new ResponseExtractor<ClientHttpResponse>() {
    @Override
    public ClientHttpResponse extractData(ClientHttpResponse response) throws IOException {
        InputStream inputStream = response.getBody();
        /*
         * 在这个地方从inputStream中读取数据,或者调用自己的方法读取inputStream来处理数据
        */
        return response;
    }
});
相关推荐
工一木子3 小时前
【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)
springboot·idea
源码姑娘17 小时前
基于DeepSeek的智慧医药系统(源码+部署教程)
java·人工智能·程序人生·毕业设计·springboot·健康医疗·课程设计
程序员小白条1 天前
【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程
java·程序员·vue·springboot·毕设·管理系统·课设
Kale又菜又爱玩4 天前
Logback:高性能日志框架完全指南
java·springboot·logback
Jing_saveSlave5 天前
基于 Spring Boot 的企业级快速启动模板 —— spring-quick
spring boot·后端·spring·springboot·敏捷开发·脚手架·企业级
LUCIAZZZ6 天前
ThreadLocal的Key是弱引用给垃圾回收带来的问题
java·开发语言·jvm·spring·springboot
放学-别走11 天前
基于springboot 以及vue前后端分离架构的求职招聘系统设计与实现
java·mysql·spring·vue·毕业设计·springboot·毕设
陌殇殇11 天前
004 Kafka异常处理
中间件·kafka·springboot
在线打码11 天前
OpenAPI Generator:API开发的瑞士军刀
后端·jmeter·springboot·yaml·openapi
梦在旅途13 天前
事务中无法切换数据源?DataSourceSwitchInvoker:轻松实现多数据源切换执行工具类
springboot