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

Java8对接三方流式接口,并实时输出(GPT)

Java对接模型流式接口,并流式输出

核心依赖

  		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.33</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

Demo代码

@GetMapping(value = "/test", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public DeferredResult<ResponseBodyEmitter> proxyModel22() throws IOException {
        DeferredResult<ResponseBodyEmitter> deferredResult = new DeferredResult<>();

        // 创建 URL
        URL url = new URL("Third-party API");

        // 打开连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        connection.setDoOutput(true); // 设置为 POST 请求
        connection.setDoInput(true); // 允许读取响应

		// 构建请求体
        String bodyJSON = "{\n" +
                "    \"input\": \"Who are you?\",\n" +
                "    \"user\": \"guest\",\n" +
                "    \"stream\": true,\n" +
                "    \"increase\": true,\n" +
                "    \"sessionId\": \"9xxxxxx\",\n" +
                "    \"history\": []\n" +
                "}";
        JSONObject jsonObject = JSON.parseObject(bodyJSON);
        try (OutputStream os = connection.getOutputStream()) {
            os.write(jsonObject.toString().getBytes(StandardCharsets.UTF_8)); // 写入请求体
            os.flush();
        }

        // 检查响应状态码
        int responseCode = connection.getResponseCode();
        if (responseCode == HttpURLConnection.HTTP_OK) {
            ResponseBodyEmitter emitter = new ResponseBodyEmitter();
            InputStream inputStream = connection.getInputStream();

            Thread thread = new Thread(() -> {
                byte[] buffer = new byte[4096]; // 缓冲区大小
                int length;

                try {
                    while ((length = inputStream.read(buffer)) != -1) {
                        // 只发送实际读取的数据长度
                        byte[] dataToSend = new byte[length];
                        System.arraycopy(buffer, 0, dataToSend, 0, length);
                        emitter.send(dataToSend);
                    }
                    inputStream.close();
                    emitter.complete(); // 完成发送
                } catch (IOException e) {
                  log.error("错误信息为: " + e);
                }
            });

            thread.start();

            deferredResult.setResult(emitter);
        } else {
            // 如果第三方服务返回错误状态码
            deferredResult.setErrorResult(new RuntimeException("Third-party API returned an error: " + responseCode));
        }

        return deferredResult;
    }

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

相关文章:

  • CVE-2024-2961漏洞的简单学习
  • 【ACM独立出版|高校主办】第四届信号处理与通信技术国际学术会议(SPCT 2024)
  • 理解 Python 中的 __getitem__ 方法:在自定义类中启用索引和切片操作
  • 群控系统服务端开发模式-应用开发-前端级别功能开发
  • MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
  • hadoop3.x 新特性
  • 【数据库】Oracle和Mysql的区别
  • 多媒体应用设计师需要掌握多种软件
  • 动态化-鸿蒙跨端方案介绍
  • C++day6
  • MySQL5.7.36之主从复制增强半同步复制-centos7
  • Linux下数据库相关知识点及SQLite3相关知识,和callback回调函数
  • 【区块链 + 供应链】长虹生产物料质量信息管理系统 | FISCO BCOS应用案例
  • 初始QT!
  • [线程]单例模式 及 指令重排序
  • CodeSys中动态切换3D模型
  • 计算机知识科普问答--1
  • QT教程:start()和startTimer()的区别
  • 运维学习————kafka(1)
  • 【LVI-SAM】激光点云如何辅助视觉特征深度提取
  • 前端黑科技:使用 JavaScript 实现网页扫码功能
  • ElasticSearch-关联关系
  • Ruoyi若依框架中工单管理(智能售货机运营管理系统)
  • 前端知识HTMLCSS
  • 软件测试 - 性能测试 (概念)(并发数、吞吐量、响应时间、TPS、QPS、基准测试、并发测试、负载测试、压力测试、稳定性测试)
  • 浙大数据结构:01-复杂度2 Maximum Subsequence Sum