案例助手:聊天接口兼容application/json

This commit is contained in:
liu.zixi
2025-09-30 12:03:30 +08:00
parent 660cee2112
commit 2358c2e881

View File

@@ -206,6 +206,14 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
@Override
public void onFailure(@NotNull EventSource eventSource, @Nullable Throwable e, @Nullable Response response) {
log.error("调用接口 [{}] 接口异常", request.url(), e);
// 如果是 content-type 错误,尝试作为普通 HTTP 请求处理
if (e instanceof IllegalStateException && e.getMessage() != null && e.getMessage().contains("Invalid content-type")) {
log.warn("服务器返回的 Content-Type 不是 text/event-stream尝试作为普通 HTTP 请求处理");
CaseAiChatServiceImpl.this.handleAsRegularHttpRequest(request, sseEmitter, conversationData);
return;
}
if (e != null) {
sseEmitter.completeWithError(e);
} else {
@@ -594,6 +602,35 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
}
}
/**
* 当 SSE 失败时,作为普通 HTTP 请求处理
*/
private void handleAsRegularHttpRequest(Request request, SseEmitter sseEmitter, ConversationData conversationData) {
try {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String responseBody = response.body().string();
log.info("作为普通 HTTP 请求处理成功,将响应原封不动推送给前端");
// 将响应内容原封不动地推送到 SseEmitter
sseEmitter.send(responseBody);
sseEmitter.complete();
} else {
log.error("普通 HTTP 请求失败,状态码: {}", response.code());
sseEmitter.completeWithError(new RuntimeException("HTTP 请求失败,状态码: " + response.code()));
}
} catch (Exception e) {
log.error("处理普通 HTTP 请求异常", e);
sseEmitter.completeWithError(e);
}
}
/**
* 对话数据容器
*/