首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SSE流 webclient

SSE流 webclient

原创
作者头像
用户3672714
发布2025-07-23 16:18:56
发布2025-07-23 16:18:56
35700
代码可运行
举报
运行总次数:0
代码可运行

在 Java 中使用 WebClient + SSE(Server-Sent Events) 来消费服务端流式响应是 Spring WebFlux 中推荐的方式。下面是完整的示例结构,展示如何使用 WebClient 接收 SSE 数据流,适用于对接 OpenAI、LangChain、Spring SSE 服务等流式响应。


一、服务端返回 SSE(text/event-stream)

代码语言:javascript
代码运行次数:0
运行
复制
// 示例 Controller - 模拟返回 SSE 流数据@RestController@RequestMapping("/sse")public class SseServerController {    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)    public Flux<String> streamEvents() {        return Flux.interval(Duration.ofMillis(500))                   .map(i -> "服务器消息: " + i)                   .take(10);    }}php364 Bytes© 菜鸟-创作你的创作

二、客户端 WebClient 接收 SSE 流(推荐方式)

你可以使用 WebClient 来发起 SSE 请求,并以 Flux 方式处理:

代码语言:javascript
代码运行次数:0
运行
复制
@Componentpublic class SseClient {    private final WebClient webClient = WebClient.create("http://localhost:8080");    public void consumeSseStream() {        webClient.get()                .uri("/sse/stream")                .accept(MediaType.TEXT_EVENT_STREAM)                .retrieve()                .bodyToFlux(String.class)                .doOnNext(msg -> System.out.println("收到消息: " + msg))                .blockLast(); // 阻塞直到流完成(可改为 subscribe 异步)    }}php476 Bytes© 菜鸟-创作你的创作

或者异步监听(非阻塞):

代码语言:javascript
代码运行次数:0
运行
复制
public void asyncSseListen() {    webClient.get()             .uri("/sse/stream")             .accept(MediaType.TEXT_EVENT_STREAM)             .retrieve()             .bodyToFlux(String.class)             .subscribe(msg -> {                 System.out.println("接收到: " + msg);             }, error -> {                 System.err.println("错误: " + error.getMessage());             }, () -> {                 System.out.println("接收结束");             });}php463 Bytes© 菜鸟-创作你的创作

三、使用 WebClient 对接 OpenAI 流式接口(SSE)

如果你使用的是 OpenAI Chat Completion 接口并启用 stream=true,格式类似 SSE:

代码语言:javascript
代码运行次数:0
运行
复制
public void callOpenAIStream(String prompt) {    WebClient client = WebClient.builder()        .baseUrl("https://api.openai.com/v1")        .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer YOUR_API_KEY")        .build();    Map<String, Object> requestBody = Map.of(        "model", "gpt-3.5-turbo",        "stream", true,        "messages", List.of(Map.of("role", "user", "content", prompt))    );    client.post()        .uri("/chat/completions")        .contentType(MediaType.APPLICATION_JSON)        .accept(MediaType.TEXT_EVENT_STREAM)        .bodyValue(requestBody)        .retrieve()        .bodyToFlux(String.class) // 返回每一行 SSE 数据        .takeUntil(msg -> msg.contains("[DONE]")) // OpenAI 特有结束标志        .map(msg -> parseOpenAIChunk(msg)) // 你可在此解析 JSON 结构        .doOnNext(System.out::println)        .blockLast();}php848 Bytes© 菜鸟-创作你的创作

四、注意事项

  • bodyToFlux(String.class) 获取每个 SSE 数据块;
  • OpenAI 返回的是 伪 SSE(非标准 JSON,每行开头为 data:,需解析;
  • 如果你使用 Spring Boot 3.x + WebFlux,无需任何特殊依赖;
  • 对接 GPT 时需设置 header 和解析 data: {json...} 行。

https://www.52runoob.com/archives/4332

五、前端配合(原生 JS)

代码语言:javascript
代码运行次数:0
运行
复制
<script>  const source = new EventSource("/sse/stream");  source.onmessage = function(e) {    console.log("前端收到数据:", e.data);  };</script>php143 Bytes© 菜鸟-创作你的创作

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档