YGChatCS/request/base/request.js

143 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { BASE_URL } from "../../constant/base";
const defaultConfig = {
header: {
Authorization: 'Basic Y3VzdG9tOmN1c3RvbQ==', // 可在此动态设置 token
'Content-Type': 'application/x-www-form-urlencoded'
},
};
function request(url, args = {}, method = 'POST', customConfig = {}) {
// 判断 url 是否以 http 开头
if (!/^http/.test(url)) {
url = BASE_URL + url;
}
// 动态获取 token
const token = uni.getStorageSync('token');
let header = {
...defaultConfig.header,
...customConfig.header
};
// 判断是否需要 token
if (customConfig.noToken) {
delete header.Authorization;
} else {
if (token) {
header.Authorization = `Bearer ${token}`;
}
}
console.log("请求头customConfig:" + JSON.stringify(customConfig))
const config = {
...defaultConfig,
...customConfig,
header
};
console.log("请求接口:" + url)
console.log("请求头:" + JSON.stringify(config))
console.log("请求参数:" + JSON.stringify(args))
return new Promise((resolve, reject) => {
uni.request({
url,
data: args,
method,
...config,
success: (res) => {
console.log("请求响应:" + JSON.stringify(res))
resolve(res.data)
},
fail: (err) => {
console.error("请求失败:", err);
reject(err)
}
});
});
}
// 默认 POST
request.post = function(url, args = {}, config = {}) {
return request(url, args, 'POST', config);
};
// 支持 GET
request.get = function(url, args = {}) {
return request(url, args, 'GET');
};
/**
* 获取AI聊天流式信息仅微信小程序支持
* @param {Object} params 请求参数
* @param {Function} onChunk 回调,每收到一段数据触发
* @returns {Promise}
*/
request.getAIChatStream = function(params, onChunk) {
return new Promise((resolve, reject) => {
const token = uni.getStorageSync('token');
console.log("发送请求内容: ", params)
// #ifdef MP-WEIXIN
const requestTask = uni.request({
url: BASE_URL + '/agent/assistant/chat', // 替换为你的接口地址
method: 'POST',
data: params,
enableChunked: true,
header: {
Accept: 'text/event-stream',
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`, // 如需token可加
},
responseType: 'arraybuffer',
success(res) {
resolve(res.data);
},
fail(err) {
reject(err);
}
});
requestTask.onHeadersReceived(res => {
console.log('onHeadersReceived', res);
});
requestTask.onChunkReceived(res => {
const base64 = uni.arrayBufferToBase64(res.data);
let data = '';
try {
data = decodeURIComponent(escape(atob(base64)));
} catch (e) {
// 某些平台可能不支持 atob可以直接用 base64
data = base64;
}
const messages = parseSSEChunk(data);
messages.forEach(msg => {
if (onChunk) onChunk(msg);
});
});
// #endif
});
}
// 解析SSE分段数据
function parseSSEChunk(raw) {
// 拆分为多段
const lines = raw.split('\n\n');
const results = [];
lines.forEach(line => {
// 只处理包含 data: 的行
const dataMatch = line.match(/data:(\{.*\})/);
if (dataMatch && dataMatch[1]) {
try {
const obj = JSON.parse(dataMatch[1]);
results.push(obj);
} catch (e) {
// 解析失败忽略
}
}
});
return results;
}
export default request;