-
Creator 版本: cocos creator 2.4.14
-
目标平台: iOS / Android
-
重现方式:模拟器 真机必现
公司有个基于大模型AI聊天的项目,聊天数据使用http post,字节流的方式返回,完成代码后再浏览器上运行是没有问题的,但是模拟器或者真机,这个http请求直接报了超时,然后走了onerror方法,感觉cocos还没直接event-stream的链接方式,想请教一下如何解决。
下面我会贴上我的请求代码
//发送聊天请求
private static ChatCurrentRequest: XMLHttpRequest | null = null; // 维护一个全局的 xhr 变量
public static SendChatMessage(url: string, params: any, options: { onFinish?: () => void, onProgress?: (responseText: string) => void, onError?: (error: any) => void }){
let isFinish = false;
const { onFinish = () => {}, onProgress = () => {}, onError = () => {} } = options;
// 先中断上一个请求(如果有的话)
if (this.ChatCurrentRequest) {
this.ChatCurrentRequest.abort();
}
var xhr = new XMLHttpRequest();
this.ChatCurrentRequest = xhr; //记录请求
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Accept', 'text/event-stream');
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
if(xhr.status != 200 ){
if(xhr.status==0){
onFinish();
return;
}
onError(xhr.response);
return;
}
if (!isFinish) {
onFinish();
isFinish = true;
}
}
};
xhr.onerror = function () {
HttpUtil.ChatCurrentRequest = null;
onError(null);
}
let oldText = '';
xhr.onprogress = function () {
let newResponse = xhr.response.replace(oldText, '');
oldText += newResponse; // 更新 oldText,确保完整记录流式返回的数据
let req = HttpUtil.decode(newResponse);
if (req && req.length >= 1) {
req.forEach(data => {
if (data == '[DONE]') {
if (!isFinish) {
onFinish();
isFinish = true;
}
return;
}
});
onProgress(req); // 这里把 req 传递给回调函数
} else {
console.error('消息解析异常:', newResponse);
}
}
xhr.send(JSON.stringify(params));
}