怎么用springboot将第三方返回的SSE流式返回结果给前端?
时间: 2025-04-03 09:04:05 AIGC 浏览: 225
### 处理来自第三方的SSE流并将其转发到前端
在 Spring Boot 中实现 SSE(Server-Sent Events)是一种有效的方式,用于从前端接收实时更新的数据。当涉及到从第三方服务获取 SSE 流并将这些数据传递给前端时,可以采用以下方法。
#### 使用 `Flux` 和 Web Client 来处理 SSE 数据
Spring 提供了响应式的编程模型来支持这种场景。通过使用 `WebClient` 获取远程 SSE 流,并利用 Reactor 的 `Flux` 将其转换为可订阅的事件源[^1]。
以下是具体的代码示例:
```java
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
public class SseController {
@GetMapping(value = "/stream", produces = "text/event-stream")
public Flux<ServerSentEvent<String>> stream() {
return WebClient.create()
.get()
.uri("https://third-party-service.com/sse") // 替换为目标 URL
.retrieve()
.bodyToFlux(ServerSentEvent.class) // 转换为 Flux<SSE>
.map(event -> ServerSentEvent.<String>builder()
.id(event.id())
.event(event.event())
.data((String) event.data()) // 假设数据是字符串形式
.build());
}
}
```
上述代码展示了如何创建一个控制器 `/stream`,它会向客户端发送基于 SSE 协议的消息。此消息是从指定的第三方服务拉取而来[^2]。
#### 配置 CORS 支持
如果您的应用运行在一个不同的域上,则需要配置跨域资源共享 (CORS),以便允许浏览器访问该 API。
```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/stream").allowedOrigins("*");
}
}
```
这段代码启用了针对路径 `/stream` 的全局 CORS 设置,允许任何来源发起请求[^3]。
#### 客户端 JavaScript 实现
为了使前端能够消费这个 SSE 流,可以通过原生 JavaScript 或者库如 Axios 进行设置。
```javascript
const eventSource = new EventSource('/stream');
eventSource.onmessage = function(e) {
console.log('New message:', e.data);
};
eventSource.onerror = function(err) {
console.error('Error occurred', err);
};
```
以上脚本片段定义了一个新的 `EventSource` 对象连接至服务器上的 `/stream` 地址,并监听传入的消息以及错误情况[^4]。
---
阅读全文
相关推荐



















