封装代码
import Request, { HttpRequestConfig } from 'luch-request'
export interface Result {
code: number
message: string
success?: boolean
}
export interface ResultData<T = any> extends Result {
data: T
}
export const ResultEnum = {
SUCCESS: 200,
EXPIRE: [305, 601, 602],
ERROR: -1,
ERRMESSAGE: '请求失败',
TIMEOUT: 25000,
TYPE: 'success'
} as const
const service = new Request()
service.setConfig((config) => {
config.timeout = ResultEnum.TIMEOUT
config.baseURL = import.meta.env.VITE_APP_NODE_ENV === 'development' ? import.meta.env.VITE_APP_BASE_API : import.meta.env.VITE_APP_BASE_URL
return config
})
service.interceptors.request.use(
(config) => {
config.header = {
...config.header
}
return config
},
(config) => {
uni
.showToast({
title: '请求错误',
icon: 'error'
})
.then((r) => {})
return Promise.reject(config)
}
)
service.interceptors.response.use(
(response) => {
const { data } = response
if (ResultEnum.EXPIRE.includes(data.code)) {
uni.showToast({
title: data.message || ResultEnum.ERRMESSAGE,
icon: 'error'
})
return Promise.reject(data)
}
if (data.code && data.code !== ResultEnum.SUCCESS) {
uni.showToast({
title: data.message || ResultEnum.ERRMESSAGE,
icon: 'error'
})
return Promise.reject(data)
}
return data
},
(response) => {
const status = response?.statusCode
let message = ''
console.log(response)
switch (status) {
case 401:
message = 'token 失效,请重新登录'
break
case 403:
message = '拒绝访问'
break
case 404:
message = '请求地址错误'
break
case 500:
message = '服务器故障'
break
default:
message = '网络连接故障'
}
uni.showToast({
title: message,
icon: 'error'
})
return Promise.reject(response)
}
)
const http = {
get<T>(url: string, params?: object, config?: HttpRequestConfig): Promise<ResultData<T>> {
return service.get(url, { params, ...config })
},
post<T>(url: string, data?: object, config?: HttpRequestConfig): Promise<ResultData<T>> {
return service.post(url, data, config)
},
put<T>(url: string, data?: object, config?: HttpRequestConfig): Promise<ResultData<T>> {
return service.put(url, data, config)
},
delete<T>(url: string, data?: object, config?: HttpRequestConfig): Promise<ResultData<T>> {
return service.delete(url, data, config)
}
}
export default http
使用示例
import http from '@/http'
export interface UpdateUserInfoInterface {
avatarUrl?: string
nickname?: string
}
export interface UserInfoInterface {
id: number
wxOpenId: string
nickname: string
avatarUrl: string
isVip: number
vipExpireTime: string
}
export function getUserInfo() {
return http.get<UserInfoInterface>('/api/user/wxLogin/getUserInfo')
}
export function updateUserInfo(userInfo: UpdateUserInfoInterface) {
return http.post('/api/user/wxLogin/updateUser')
}