SpringBoot模拟实现流式输出效果

 更新时间:2025年03月17日 09:33:53   作者:果壳~  
这篇文章主要为大家详细介绍了如何使用SpringBoot模拟实现流式输出效果,并在前端使用流式接收数据并打印,感兴趣的小伙伴可以参考一下

现在AI的接口由于生成内容比较慢都是采用的流式输出的方式。这里将模拟一下流式输出。

后端接口

import cn.hutool.json.JSONUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/test")
public class TestController {

    @PostMapping("/stream")
    public ResponseEntity<StreamingResponseBody> streamData() {
        Map<String, String> map = new HashMap<>();
        map.put("content", "内容");

        StreamingResponseBody responseBody = outputStream -> {
            try (PrintWriter writer = new PrintWriter(outputStream)) {
                for (int i = 0; i < 10; i++) {
                    map.put("content", "内容:" + i);
                    writer.println(JSONUtil.toJsonStr(map));
                    writer.flush();
                    // 模拟一些延迟
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.TEXT_PLAIN);
        // 指示这是一个流式响应
        headers.setContentLength(-1L);

        return new ResponseEntity<>(responseBody, headers, HttpStatus.OK);
    }
}

传统非流式-前端

url = 'http://127.0.0.1:8080/test/stream'
async function getResp(){
	const startTime = performance.now();
	console.log("非流式输出")
	const resp = await fetch(url,{
		method: 'POST',
		headers: {
			'Content-Type': 'application/json'
		},
		body: JSON.stringify({
			content: '讲个笑话'
		})
	});
	const msg = await resp.text();
	console.log(msg)
	const endTime = performance.now();
	console.log(`执行耗时: ${endTime - startTime} ms`);
}
getResp()

测试结果如下,程序会等待所有内容都返回了,才输出内容

流式-前端

async function getRespStream(){
	console.log("流式输出")
	const resp = await fetch(url,{
		method: 'POST',
		headers: {
			'Content-Type': 'application/json'
		},
		body: JSON.stringify({
			content: '讲个笑话'
		})
	});
	
  const reader = resp.body.getReader();
	while(1){
		// value 是类型化数组
		const textDecoder = new TextDecoder()
		const {done,value} = await reader.read();
		if(done){
			break
		}
		const str = textDecoder.decode(value)
		console.log(str)
	}
}
getRespStream()

可以看到后端只要输出一段内容前端就会打印一段内容。

以上就是SpringBoot模拟实现流式输出效果的详细内容,更多关于SpringBoot流式输出的资料请关注脚本之家其它相关文章!

相关文章

  • Java中三种简单注解介绍和代码实例

    Java中三种简单注解介绍和代码实例

    这篇文章主要介绍了Java中三种简单注解介绍和代码实例,本文讲解了Override注解、Deprecated注解、Suppresswarnings注解、元注解等内容,需要的朋友可以参考下
    2014-09-09
  • Spring Security登录添加验证码的实现过程

    Spring Security登录添加验证码的实现过程

    这篇文章主要介绍了Spring Security登录添加验证码的实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java实现删除PDF中指定页面

    Java实现删除PDF中指定页面

    这篇文章主要为大家详细介绍了如何使用一个免费的国产Java库来删除PDF中的指定页面或者删除PDF中的空白页,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • SpringBoot整合达梦数据库的教程详解

    SpringBoot整合达梦数据库的教程详解

    这篇文章主要给大家介绍了SpringBoot整合达梦数据库的详细教程,文章中有详细的图片介绍和代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • SpringBoot调整ApplicationContextAware如何实现类加载顺序

    SpringBoot调整ApplicationContextAware如何实现类加载顺序

    SpringBoot调整ApplicationContextAware实现类加载顺序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java分布式事务管理框架之Seata

    Java分布式事务管理框架之Seata

    这篇文章主要介绍了Java分布式事务框架Seata,分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上
    2022-07-07
  • springboot项目实现配置跨域

    springboot项目实现配置跨域

    这篇文章主要介绍了springboot项目实现配置跨域问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Java毕业设计实战项目之仓库管理系统的实现流程

    Java毕业设计实战项目之仓库管理系统的实现流程

    这是一个使用了java+SSM+Maven+Bootstrap+mysql开发的仓库管理系统,是一个毕业设计的实战练习,具有一个仓库管理系统该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • Java聊天室之使用Socket实现通信功能

    Java聊天室之使用Socket实现通信功能

    这篇文章主要为大家详细介绍了Java简易聊天室之使用Socket实现通信功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-10-10
  • Java之dao模式详解及代码示例

    Java之dao模式详解及代码示例

    这篇文章主要介绍了Java之dao模式详解及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11

最新评论