java实现 SSE (Server-Sent Events) 流式接口转发
·
| 🎈边走、边悟🎈迟早会好 |
@GetMapping(value = "/seedSelection", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> seedSelection(@RequestParam Long plotId) {
// 验证地块ID
if (plotId == null) {
String errorMsg = JSON.toJSONString(Result.fail()
.setCode(2)
.setMessage("地块ID不能为空"));
return Flux.just("data: " + errorMsg + "\n\n");
}
// 构建请求参数
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("poltId", plotId);
// 创建WebClient实例
WebClient webClient = WebClient.builder()
.baseUrl(seedSelectionUrl)
.build();
// 发起请求并转发流式响应
return webClient.post()
.uri("")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(requestBody)
.retrieve()
.bodyToFlux(String.class)
.doOnNext(chunk -> {
// 仅保留日志打印,移除数据累加逻辑
log.debug("收到了一部分: {}", chunk);
})
.map(chunk -> "data: " + chunk + "\n\n") // 格式化为SSE格式
.onErrorResume(e -> {
// 处理错误情况
String errorMsg = JSON.toJSONString(Result.fail()
.setCode(2)
.setMessage("获取作物推荐失败:" + e.getMessage()));
log.error("种子选择流出错", e);
return Flux.just("data: " + errorMsg + "\n\n");
});
}
简化后的代码专注于实现 SSE (Server-Sent Events) 流式转发功能,主要逻辑如下:
-
参数验证:首先检查地块 ID 是否为空,若为空则返回错误信息(SSE 格式)
-
请求准备:
- 构建包含地块 ID 的请求参数
- 创建 WebClient 实例,用于调用第三方服务
-
流式转发核心逻辑:
- 使用 WebClient 向第三方服务发起 POST 请求
- 通过
bodyToFlux(String.class)将响应转换为字符串流 - 对每个数据块进行 SSE 格式转换(添加 "data:" 前缀和 "\n\n" 后缀)
- 保持了基本的日志打印以便调试
-
错误处理:
- 通过
onErrorResume捕获异常并返回格式化的错误信息 - 记录错误日志便于问题排查
- 通过
🌟感谢支持 听忆.-CSDN博客
| 🎈众口难调🎈从心就好 |
更多推荐
所有评论(0)