Files
yshop-pro-uniapp/utils/request.js

223 lines
5.4 KiB
JavaScript
Raw Normal View History

import { VUE_APP_API_URL, VUE_APP_UPLOAD_URL } from "@/config";
import cookie from "@/utils/cookie";
import { handleLoginFailure } from "@/utils/index";
import qs from 'qs'
function baseUrl() {
let url
// #ifdef H5
// h5开发环境直接走代理 vite.config.js
if (process.env.NODE_ENV === 'development') {
url = '/yshop-api'
} else {
url = VUE_APP_API_URL
}
// #endif
// #ifndef H5
url = VUE_APP_API_URL
// #endif
return url
}
class RequestUtil {
// 超时时间(毫秒)
requestTimeout = 10000
// 默认参数
defaultOptions = {}
/**
* 请求
* @param options
* @return {Promise<any>}
*/
doRequest(options = {}) {
options = this.beforeRequest(options)
return new Promise((resolve, reject) => {
uni.request({
...options,
url: `${ baseUrl() }${ options.url }`,
timeout: this.requestTimeout,
success: (res) => {
this.afterResponse(res, resolve, reject)
},
fail: (err) => {
uni.showToast({title: '请求出错了', icon: 'none'})
console.error(err)
reject(err)
}
})
})
}
/**
* 请求拦截器
* @param options
*/
beforeRequest(options) {
// 合并options用户优先
options = {
header: {},
...this.defaultOptions,
...options
}
// 设置header
const token = cookie.get('accessToken')
options.header = {
...options.header,
Authorization: token.accessToken ? 'Bearer ' + token.accessToken : '',
}
// 处理get参数被吃掉问题
if (options.method && options.method.toLowerCase() === 'get' && options.data) {
// 如果是get请求且params是数组类型如arr=[1,2]则转换成arr=1&arr=2
// const newData = stringify(options.data)
// delete options.data;
const data = qs.stringify(options.data);
if (data) {
delete options.data
options.url = `${ options.url }?${ data }`;
}
}
return options
}
/**
* 响应拦截器处理器
* @param res {RequestSuccessCallbackResult} 响应
* @param resolve
* @param reject
*/
afterResponse(res, resolve, reject) {
uni.hideLoading()
if (res.errMsg === 'uploadFile:ok') {
res.data = JSON.parse(res.data)
}
// 请求statusCode非200
if (res.statusCode !== 200) {
return reject(res.data)
}
const {data} = res
// 无权限
if ([401].includes(data.code)) {
handleLoginFailure()
return reject(data)
}
// 拦截后端响应code
if (![0, 200].includes(data.code)) {
if ([1008007023].includes(data.code)) {
return reject(data)
}
setTimeout(() => {
uni.showToast({title: data.msg, icon: 'none'})
}, 50)
return reject(data)
}
resolve(data.data)
}
/**
* get
* @param url
* @param data
* @return {Promise<*>}
*/
get(url, data = {}) {
return this.doRequest({
url,
data,
method: 'GET'
})
}
/**
* post
* @param url
* @param data
* @return {Promise<*>}
*/
post(url, data = {}) {
return this.doRequest({
url,
data,
method: 'POST'
})
}
/**
* put
* @param url
* @param data
* @return {Promise<*>}
*/
put(url, data = {}) {
return this.doRequest({
url,
data,
method: 'PUT'
})
}
/**
* delete
* @param url
* @param data
* @return {Promise<*>}
*/
delete(url, data = {}) {
return this.doRequest({
url,
data,
method: 'DELETE'
})
}
/**
* 上传
* @param options
* @return {Promise<unknown>}
* @doc https://zh.uniapp.dcloud.io/api/request/network-file.html
*/
upload(options) {
options = this.beforeRequest(options)
return new Promise((resolve, reject) => {
uni.uploadFile({
...options,
url: `${ baseUrl() }${ options.url || VUE_APP_UPLOAD_URL }`,
success: (uploadFileRes) => {
this.afterResponse(uploadFileRes, resolve, reject)
},
fail(err) {
reject(err)
}
})
})
}
/**
* 下载
* @param url
* @return {Promise<unknown>}
* @doc https://zh.uniapp.dcloud.io/api/request/network-file.html
*/
download(url) {
return new Promise((resolve, reject) => {
Request.downLoadTask = uni.downloadFile({
url,
success: (res) => {
if (res.statusCode === 200) {
return resolve(res)
}
return reject(res)
},
fail: (err) => {
reject(err)
}
});
})
}
}
export const requestUtil = new RequestUtil()