146 lines
3.3 KiB
JavaScript
146 lines
3.3 KiB
JavaScript
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 |