ry_app/utils/request.js

111 lines
3.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import store from '@/store'
import config from '@/config'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { toast, showConfirm, tansParams } from '@/utils/common'
let timeout = 10000
const baseUrl = config.baseUrl
const request = config => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
// 修复合并header而非覆盖保证Content-Type不丢失
config.header = {
'Content-Type': 'application/json;charset=UTF-8',
...config.header // 自定义header在后可覆盖默认值
}
// 修复Token非空时才拼接避免Bearer undefined
const token = getToken()
if (token && !isToken) {
config.header['Authorization'] = 'Bearer ' + token
}
console.log('Token:', token)
console.log('请求头:', config.header)
// get请求映射params参数
if (config.params) {
let url = config.url + '?' + tansParams(config.params)
// 修复:避免参数为空时最后多一个?比如params是空对象
url = url.endsWith('?') ? url.slice(0, -1) : url
config.url = url
}
return new Promise((resolve, reject) => {
const requestUrl = config.baseUrl ? config.baseUrl + config.url : baseUrl + config.url
console.log('最终请求URL:', requestUrl)
console.log('请求配置:', config)
uni.request({
method: config.method || 'get',
timeout: config.timeout || timeout,
url: requestUrl,
data: config.data,
header: config.header,
dataType: 'json'
}).then(response => {
let [error, res] = response
// 第一步:先判断网络层错误(微信拦截/连接失败)
if (error) {
const errMsg = `后端接口连接异常: ${error.errMsg || error.message}`
toast(errMsg)
reject(new Error(errMsg))
return
}
// 第二步判断HTTP状态码非200的情况
if (res.statusCode !== 200) {
const errMsg = `接口HTTP异常: ${res.statusCode}`
toast(errMsg)
reject(new Error(errMsg))
return
}
// 第三步:处理业务状态码
const code = res.data.code || 200
const msg = errorCode[code] || res.data.msg || errorCode['default']
if (code === 401) {
showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => {
if (res.confirm) {
store.dispatch('LogOut').then(() => {
uni.reLaunch({ url: '/pages/login' })
})
}
})
reject(new Error('无效的会话,或者会话已过期,请重新登录。'))
} else if (code === 403) {
console.log('403错误详情:', res.data)
toast('没有权限访问该资源')
reject(new Error('403'))
} else if (code === 500) {
toast(msg)
reject(new Error('500'))
} else if (code !== 200) {
toast(msg)
reject(new Error(code.toString()))
}
// 成功返回业务数据
resolve(res.data)
})
.catch(error => {
let { message } = error
if (message === 'Network Error') {
message = '后端接口连接异常'
} else if (message.includes('timeout')) {
message = '系统接口请求超时'
} else if (message.includes('Request failed with status code')) {
message = '系统接口' + message.substr(message.length - 3) + '异常'
}
toast(message)
reject(error)
})
})
}
export default request