You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
2.7 KiB
JavaScript

// 默认配置
const DEFAULT_CONFIG = {
baseURL: 'http://192.168.3.198:8500', // 替换为你的接口基础地址
timeout: 5000,
header: {
'Content-Type': 'application/json;charset=utf-8'
}
}
// 请求拦截器(发送前执行)
const requestInterceptor = (config) => {
// 示例:添加 token
const token = uni.getStorageSync('token')
if (token) {
config.header = {
...config.header,
'Authorization': `Bearer ${token}`
}
}
return config
}
// 响应拦截器(收到响应后执行)
const responseInterceptor = (response) => {
// 可以根据后端返回结构统一处理
const { statusCode, data } = response
if (statusCode === 200) {
// 假设后端返回 { code: 200, data: {}, message: '' }
if (data.code === 200) {
return Promise.resolve(data) // 直接返回业务数据
} else {
// 业务错误,抛出异常
return Promise.reject({
code: data.code,
message: data.status || '请求失败'
})
}
} else {
// HTTP 错误
return Promise.reject({
code: statusCode,
message: `HTTP错误${statusCode}`
})
}
}
// 核心请求函数
const request = (options) => {
// 合并配置
const config = {
...DEFAULT_CONFIG,
...options,
header: {
...DEFAULT_CONFIG.header,
...(options.header || {})
}
}
// 执行请求拦截器
let interceptedConfig = config
if (requestInterceptor) {
interceptedConfig = requestInterceptor(config) || config
}
// 返回 Promise
return new Promise((resolve, reject) => {
// 拼接完整 URL
const url = interceptedConfig.baseURL + interceptedConfig.url
uni.request({
url,
method: interceptedConfig.method || 'GET',
data: interceptedConfig.data,
header: interceptedConfig.header,
timeout: interceptedConfig.timeout,
success: (res) => {
// 执行响应拦截器
if (responseInterceptor) {
responseInterceptor(res).then(resolve).catch(reject)
} else {
resolve(res)
}
},
fail: (err) => {
uni.showToast({
title: '网络请求失败',
icon: 'none'
})
reject(err)
}
})
})
}
// 便捷方法
request.get = (url, data, options = {}) => {
return request({
method: 'GET',
url,
data,
...options
})
}
request.post = (url, data, options = {}) => {
return request({
method: 'POST',
url,
data,
...options
})
}
request.put = (url, data, options = {}) => {
return request({
method: 'PUT',
url,
data,
...options
})
}
request.delete = (url, data, options = {}) => {
return request({
method: 'DELETE',
url,
data,
...options
})
}
export default request