Files
kairos_miniapp/utils/request.js
2026-03-27 17:55:18 +08:00

146 lines
3.3 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 httpEnv from "./auth/env"
import { getToken, removeToken } from "./auth/manageToken"
const baseApi = {
//开发版
develop: "https://kairos-wx.test.tuzuu.com/api",
// 体验版
trial: "https://kairos-wx.test.tuzuu.com/api",
// 正式版
release: "https://kairos-wx.test.tuzuu.com/api",
}
//获取当前环境的接口前缀
export const baseUrl = baseApi[httpEnv]
function request(options) {
return new Promise((resolve, reject) => {
const token = getToken()
let header = {}
if (token) {
header.Authorization = 'Bearer ' + token;
}
wx.request({
url: baseUrl + options.url,
method: options.method || 'GET',
data: options.data || {},
header,
timeout: 10000,
success(res) {
if (res.statusCode == 404) {
wx.showToast({
title: '接口404',
icon: 'none'
})
return
}
const { code, data, message } = res.data
if (code == 1) {
resolve(data)
} else if (code == 401) {
//重新登录
wx.showToast({
title: message,
icon: 'none'
})
removeToken()
setTimeout(() => {
wx.redirectTo({
url: '/pages/system/login/index',
})
}, 1000);
}
else {
wx.showToast({
title: message,
icon: 'none'
})
}
},
fail(err) {
wx.showToast({
title: "网络错误,请检查网络",
icon: 'none'
})
reject(err)
},
})
})
}
request.get = function (url, options) {
return request({
url: url,
data: options,
method: "GET",
})
}
request.post = function (url, options) {
return request({
url: url,
data: options,
method: "POST",
})
}
//流式
let lastChunk = '' //流可能会被截断,需要补充
export function streamRequest(url, data, onChunkReceived) {
return new Promise((resolve, reject) => {
const token = getToken()
let header = {}
if (token) {
header.Authorization = 'Bearer ' + token;
}
let requestTask = wx.request({
url: baseUrl + url,
data: data || {},
method: 'POST',
header,
timeout: 100000,
responseType: "arraybuffer",
enableChunked: true, //关键!开启流式传输模式
success: () => {
resolve()
},
fail: (e) => {
console.log(e);
reject()
}
})
//处理流
if (onChunkReceived) {
lastChunk = ''
requestTask.onChunkReceived((response) => {
let data = response.data;
// console.log(decodeStream(data));
onChunkReceived(decodeStream(data))
})
}
})
}
//流素具解码
function decodeStream(data) {
let uint8Array = new Uint8Array(data); // 将 ArrayBuffer 转换为 Uint8Array
let responseText = decodeURIComponent(escape(String.fromCharCode.apply(null, uint8Array))); // 使用 apply 扩展字节
// 处理数据,移除前缀等操作
if (lastChunk) {
responseText = "data: " + lastChunk + responseText
lastChunk = ""
}
// 处理数据,移除前缀等操作
responseText = responseText.replaceAll("data: ", '');
let jsonStrings = responseText.trim().split(/\n+/);
// 过滤掉解析失败的部分
let jsonArray = jsonStrings.map(jsonStr => {
try {
return JSON.parse(jsonStr);
} catch (e) {
lastChunk = jsonStr
console.error('JSON格式不正确(已做兼容处理):');
return null; // 如果解析失败返回null
}
}).filter(item => item !== null);
return jsonArray
}
export default request