🎈边走、边悟🎈迟早会好

@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) 流式转发功能,主要逻辑如下:

  1. 参数验证:首先检查地块 ID 是否为空,若为空则返回错误信息(SSE 格式)

  2. 请求准备:

    • 构建包含地块 ID 的请求参数
    • 创建 WebClient 实例,用于调用第三方服务
  3. 流式转发核心逻辑:

    • 使用 WebClient 向第三方服务发起 POST 请求
    • 通过bodyToFlux(String.class)将响应转换为字符串流
    • 对每个数据块进行 SSE 格式转换(添加 "data:" 前缀和 "\n\n" 后缀)
    • 保持了基本的日志打印以便调试
  4. 错误处理:

    • 通过onErrorResume捕获异常并返回格式化的错误信息
    • 记录错误日志便于问题排查

 🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好

更多推荐