Files

223 lines
5.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()