介紹
用于構建基于 WebFlux 的響應式 Web 應用程序。集成了 Spring WebFlux 模塊,支持響應式編程模型,構建非阻塞、異步的 Web 應用。WebFlux 使用了非阻塞的異步模型,能夠更好地處理高并發請求。適合需要實時數據推送的應用場景。
WebClient 是 Spring WebFlux 中用于創建 WebClient 實例的構建器方法。用于發起 HTTP 請求的非阻塞、響應式的客戶端,可以與 Web 服務進行交互,支持異步和響應式編程模型。
訊飛星火
官方文檔:https://www.xfyun.cn/doc/spark/X1http.html
接口地址:https://spark-api-open.xf-yun.com/v2/chat/completions
效果圖
流式異步返回數據
依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
構建請求體
/*** 構建消息體* @param userId 用戶的唯一id,表示一個用戶,user_123456* @param text 問題內容* @return*/
private JSONObject builderBody(String userId,String text){// 創建最外層的JSON對象并填充字段JSONObject jsonObject = new JSONObject();jsonObject.put("user", userId);jsonObject.put("model", "x1");jsonObject.put("stream", true);jsonObject.put("max_tokens", 4096);// 創建單個消息的JSON對象JSONObject messageObject = new JSONObject();messageObject.put("role", "user");messageObject.put("content", text);messageObject.put("temperature", "0.5");// 歷史記錄JSONObject test = new JSONObject();test.put("role", "user");test.put("content", "梅州城市為背景");test.put("temperature", "0.5");// 創建messages數組并將消息對象添加到數組中JSONArray messagesArray = new JSONArray();messagesArray.add(messageObject);messagesArray.add(test);// 將messages數組添加到最外層的JSON對象中jsonObject.put("messages", messagesArray);return jsonObject;
}
控制器
private final static String APIPassword="gQnwqGhbiifKUgtxhQrXnb:JdDduuVNXTxduGIvwtorNjw";@GetMapping("/chat")
public Flux<String> chat(String text) {return WebClient.builder().defaultHeader("Content-Type", "application/json; charset=UTF-8") // 明確指定UTF-8.defaultHeader("Authorization","Bearer" + APIPassword).baseUrl("https://spark-api-open.xf-yun.com/v2/chat/completions").build().post() //post請求.accept(MediaType.TEXT_EVENT_STREAM)// 設置接受的響應類型.bodyValue(builderBody("123",text).toString()) //請求體內容.retrieve() // 執行請求.bodyToFlux(String.class) // 響應體轉換成 String.map(s->s).timeout(Duration.ofSeconds(10)) // 設置請求超時時間,10秒.retry(3) // 如果發生錯誤,最多重試3次.onErrorResume(WebClientRequestException.class, ex ->Flux.just(ex.getLocalizedMessage())) // 處理 WebClient 請求錯誤.doOnTerminate(() -> {// 終止流時執行的操作,可能用于清理資源等}).doOnCancel(() -> {// 流取消時執行的操作}).doFinally(signalType -> {// 在流結束時執行的操作,包括正常完成、取消或出錯等情況});
}