Java接收text/event-stream格式数据的详细代码

 更新时间:2023年07月20日 11:01:46   作者:明天我来了  
这篇文章主要介绍了java接收text/event-stream格式数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

java接收text/event-stream格式数据,并且解决接收HTTPS会不是流式输出问题

前段时间因为要对接语音转文字接口,对方接口输出的是text/event-stream返回,返回的是流式输出,本人在百度找了好久,一直没有找到关于怎么接收流式返回的文章,可能很多人不清楚流式输出指的是什么,流式输出是和对方建立一个长连接,接口方会一直不断的给我们推送数据,而不用等待对方接口完全输出后在把返回值一次性返回。

先贴代码

get请求

public String getEventStream(String urlStr, HttpServletResponse response) {
        long statr = System.currentTimeMillis();
        log.info("开始请求接口url:{}", urlStr);
        InputStream is = null;
        StringBuffer bu = new StringBuffer();
        try {
            URL url = new URL(urlStr);
            URLConnection conn = url.openConnection();
            is = conn.getInputStream();
            byte[] b = new byte[1024];
            int len = -1;
            long end = System.currentTimeMillis();
            log.info("接口url:{},请求开始流式输出{}", urlStr, end - statr);
            while ((len = is.read(b)) != -1) {
                String line = new String(b, 0, len, "utf-8");
                // 处理 event stream 数据
                response.getWriter().write(line);
                response.getWriter().flush();
                bu.append(line);
            }
        } catch (IOException e) {
            log.error("请求模型接口异常", e);
            throw new BusinessException(ResponseCode.TOPIC_INITIATION_FAILED);
        } finally {
            if (!Objects.isNull(is)) {
                try {
                    //12.关闭输入流
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bu.toString();
    }

这里的urlStr参数是url加参数,示例:https://baidu.com?text=12345678response是因为我需要同样用流式输出文字给前端,如果你不需要返回给前端,可以不用response参数。

post请求

public String postEventStream(String urlStr, String json, HttpServletResponse response) {
        long statr = System.currentTimeMillis();
        log.info("开始请求接口url:{},请求参数{}", urlStr,json);
        InputStream is = null;
        //11.读取输入流中的返回值
        StringBuffer bu = new StringBuffer();
        try {
            //1.设置URL
            URL url = new URL(urlStr);
            //2.打开URL连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //3.设置请求方式
            conn.setRequestMethod("POST");
            //4.设置Content-Type
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            //5.设置Accept
            conn.setRequestProperty("Accept", "text/event-stream");
            //6.设置DoOutput
            conn.setDoOutput(true);
            //7.设置DoInput
            conn.setDoInput(true);
            //8.获取输出流
            OutputStream os = conn.getOutputStream();
            //9.写入参数(json格式)
            os.write(json.getBytes("utf-8"));
            os.flush();
            os.close();
            //10.获取输入流
            is = conn.getInputStream();
            byte[] bytes = new byte[1024];
            int len = 0;
            long end = System.currentTimeMillis();
            log.info("接口url:{},请求参数{},请求开始流式输出{}", urlStr,json, end - statr);
            while ((len = is.read(bytes)) != -1) {
                String line = new String(bytes, 0, len, "utf-8");
                response.getWriter().write(line);
                response.getWriter().flush();
                bu.append(line);
            }
        } catch (IOException e) {
            log.error("请求模型接口异常", e);
            throw new BusinessException(ResponseCode.TOPIC_INITIATION_FAILED);
        } finally {
            if (!Objects.isNull(is)) {
                try {
                    //12.关闭输入流
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bu.toString();
    }

第一次写文章,表达不好请谅解,这里使用的jdk版本是1.8,如果对于springboot怎么样返回给前端流式输出有疑问,可以私信问我

到此这篇关于Java接收text/event-stream格式数据的详细代码的文章就介绍到这了,更多相关java接收text/event-stream格式数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中ThreadLocal的解析

    Spring中ThreadLocal的解析

    这篇文章主要介绍了Spring中ThreadLocal的解析,Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突,下面一起进入文章学子详细内容吧
    2022-01-01
  • java数组元素的引用实例讲解

    java数组元素的引用实例讲解

    在本篇文章里小编给大家整理的是一篇关于java数组元素的引用实例讲解内容,有需要的朋友们可以学习参考下。
    2021-03-03
  • springboot-2.3.x最新版源码阅读环境搭建(基于gradle构建)

    springboot-2.3.x最新版源码阅读环境搭建(基于gradle构建)

    这篇文章主要介绍了springboot-2.3.x最新版源码阅读环境搭建(基于gradle构建),需要的朋友可以参考下
    2020-08-08
  • SpringBoot文件分片上传教程

    SpringBoot文件分片上传教程

    这篇文章主要介绍了SpringBoot文件分片上传教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java实现List集合转树形结构的示例详解

    Java实现List集合转树形结构的示例详解

    在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合。本文将利用Java语言实现这一功能,感兴趣的可以了解一下
    2022-08-08
  • java文本处理之计算文本句子数

    java文本处理之计算文本句子数

    这篇文章主要为大家详细介绍了java文本处理之计算文本句子数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 解决springboot+thymeleaf视图映射报错There was an unexpected error (type=Not Found, status=404)

    解决springboot+thymeleaf视图映射报错There was an unexpected erro

    这篇文章主要介绍了解决springboot+thymeleaf视图映射报错There was an unexpected error (type=Not Found, status=404)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java8 统计字符串字母个数的几种方法总结(推荐)

    java8 统计字符串字母个数的几种方法总结(推荐)

    下面小编就为大家分享一篇java8 统计字符串字母个数的几种方法总结(推荐),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来吧
    2017-11-11
  • SpringBoot整合resilience4j实现接口限流

    SpringBoot整合resilience4j实现接口限流

    最近在开发项目的时候,需要用到限流的功能,本文主要介绍了SpringBoot整合resilience4j实现接口限流,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Spring Boot日志基础使用之如何设置日志级别

    Spring Boot日志基础使用之如何设置日志级别

    这篇文章主要介绍了Spring Boot日志基础使用设置日志级别的方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09

最新评论