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.
besure_app/src/utils/request.ts

116 lines
3.9 KiB
TypeScript

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 config from '@/config'
import { getToken, removeToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { toast, showConfirm, tansParams } from '@/utils/common'
import { RequestConfig, ResponseData } from '@/types/request'
import modal from '@/plugins/modal'
let timeout = 300000
export const SERVER_BASE_URL_STORAGE_KEY = 'serverBaseUrl'
export function getBaseUrl() {
return uni.getStorageSync(SERVER_BASE_URL_STORAGE_KEY) || config.baseUrl
}
const request = <T>(config: RequestConfig): Promise<ResponseData<T>> => {
// 是否需要设置 token
const isToken = (config.headers || {}).isToken === false
config.header = config.header || {}
config.header['tenantId'] = '1'
if (getToken() && !isToken) {
config.header['Authorization'] = 'Bearer ' + getToken()
}
// POST/PUT 请求明确设置 Content-Type 为 application/json
if ((config.method === 'POST' || config.method === 'PUT') && config.data) {
config.header['Content-Type'] = 'application/json'
}
// get请求映射params参数
if (config.params) {
let url = config.url + '?' + tansParams(config.params)
url = url.slice(0, -1)
config.url = url
}
return new Promise((resolve, reject) => {
const shouldShowLoading = config.showLoading !== false
if (shouldShowLoading) {
modal.loading(config.loadingText || '加载中')
}
uni.request({
method: config.method || 'GET',
timeout: config.timeout || timeout,
url: (config.baseUrl || getBaseUrl()) + config.url,
data: config.data,
header: config.header,
dataType: 'json'
}).then(response => {
/* let [error, res] = response
if (error) {
toast('后端接口连接异常')
reject('后端接口连接异常')
return
} */
const res = response
const data: ResponseData<T> = res.data as ResponseData<T>
const code = data.code || 200
// @ts-ignore
const msg: string = errorCode[code] || data.msg || errorCode['default']
if (code === 401) {
// showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => {
// if (res.confirm) {
// useUserStore().logOut().then(res => {
// uni.reLaunch({ url: '/pages/login' })
// })
// }
// })
reject('无效的会话,或者会话已过期,请重新登录。')
removeToken()
uni.reLaunch({ url: '/pages/login' })
return
} else if (code === 500) {
toast(msg)
// 将完整的 data 对象 reject便于调用方拿到后端错误信息
reject(data)
return
} else if (code !== 200) {
toast(msg)
reject(code)
return
}
resolve(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)
})
.finally(() => {
if (shouldShowLoading) {
modal.closeLoading()
}
})
})
}
export function postAction(url: string, data?: any, isToken: boolean = true) {
return request({ data, url, method: 'POST', headers: { isToken }, })
}
export function getAction(url: string, params?: any, isToken: boolean = true) {
return request({ params, url, method: 'GET', headers: { isToken }, })
}
export function putAction(url: string, data?: any, isToken: boolean = true) {
return request({ data, url, method: 'PUT', headers: { isToken }, })
}
export function deleteAction(url: string, data?: any, isToken: boolean = true) {
return request({ data, url, method: 'DELETE', headers: { isToken }, })
}
export default request