引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Controller代码
@GetMapping("/test/stream")
public String testStream() {
String API_KEY = "xxx";
String BASE_URL = "https://qianfan.baidubce.com";
String appId = "xxx";
String conversationId = appBuilderService.createConversation(appId);
String query = "提问的问题?";
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("app_id", appId);
paramsMap.put("conversation_id", conversationId);
paramsMap.put("query", query);
paramsMap.put("stream", true);
// 创建请求体
WebClient webClient = WebClient.create(BASE_URL);
// 发起请求
Flux<String> chatResponseFlux = webClient.post()
.uri("/v2/app/conversation/runs")
.header("Authorization", "Bearer " + API_KEY)
.contentType(MediaType.APPLICATION_JSON)
.body(Mono.just(paramsMap), Map.class)
.retrieve()
.bodyToFlux(String.class)
// .doOnNext(s -> System.out.println("接收数据: " + s)) // 不订阅 Flux,只是对数据进行处理。
/*.doFinally(signalType -> {
switch (signalType) {
case ON_COMPLETE:
System.out.println("流接收完成");
break;
case ON_ERROR:
System.out.println("流因错误而终止");
break;
}
})*/
;
// 订阅响应流
// subscribe 是订阅 Flux 的方法,它不仅处理数据,还可以处理错误和完成事件。当你使用 subscribe 时,你可以提供三个回调函数:onNext(处理数据)、onError(处理错误)和 onComplete(处理完成)。这使得你可以更全面地控制如何处理流中的数据以及流的生命周期。
CountDownLatch latch = new CountDownLatch(1); // 用于同步流的完成
chatResponseFlux.subscribe( //订阅 Flux,并接收数据、错误和完成事件
value -> {
System.out.println("接收数据: " + value);
if (value.startsWith(":")) { // 忽略 SSE 的元数据行
return;
}
if (value.equals("[DONE]")) {
System.out.println("流接收完成");
latch.countDown();
}
},
error -> {
System.err.println("接收出现错误: " + error.getMessage());
latch.countDown();
},
() -> {
System.out.println("流接收完成.");
latch.countDown();
}
);
return "ok";
}