当前位置: 首页 > article >正文

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

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

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);
}

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


下面的才是正解:

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;
    }
});


http://www.kler.cn/a/444219.html

相关文章:

  • GPT-Omni 与 Mini-Omni2:创新与性能的结合
  • 宝塔SSL证书申请失败,报错:申请SSL证书错误 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘(已解决)
  • 探秘数据库索引:功能、意义与实例
  • C++ 的 format 和 vformat 函数
  • 源码安装PHP-7.2.19
  • HCIA-Access V2.5_4_3_VLAN间路由
  • 射频测试入门学习(三)——程控仪器是怎样和电脑连接通信的
  • Electron-Vue 开发下 dev/prod/webpack server各种路径设置汇总
  • 在ESP32使用AT指令集与服务器进行TCP/IP通信时,<link ID> 解释
  • ref 和 reactive 你觉得在项目中使用那个更合适
  • 5G 车联网赋能消防车调度,推动高效智能消防救援
  • 基于DockerCompose搭建Redis主从哨兵模式
  • 系列5:基于Centos-8.6 Kubernetes master节点允许运行pod节点
  • Anaconda安装(2024最新版)
  • 短视频矩阵:构建多平台曝光的高效运营网络
  • Gitlab 数据备份全攻略:命令、方法与注意事项
  • 【数值特性库】入口文件
  • 博世智驾新动力:Apache DolphinScheduler如何征服数据处理挑战
  • 视频智能分析平台LiteAIServer未戴安全帽检测算法助力矿山安全:精准监督矿工佩戴安全帽情况
  • FFmpeg库之ffplay