在APP日常使用过程中可能遇到token过期或者token失效的情况;平常大家的做法就是给个提示,然后需要再次请求一次接口重新获取token,这样的操作给用户一种极不友好的体验,为了让用户感觉不到重新获取token这个场景,那么就需要在用户不知情的情况下重新获取token且再次重新请求接口使操作流程不中断。
本次给大家介绍在请求接口request内建立重试机制,该机制统一封装在一个request请求中。
import Url from "../config/urlConfig.js"
import getToken from "@/common/getToken.js" //封装获取token的方法
/**
* header参数设置
* @param {Object} header
*/
function headers(header) {
let headers = {};
let Token = uni.getStorageSync("token")
if (Token.length!==0) { //有token的情况下设置token
let token = {"token":Token};
headers = Object.assign(token,header);
}else {
headers = header;
}
return headers;
}
/**
* 请求封装
* @param {Object} url
* @param {Object} method
* @param {Object} data
* @param {Object} headers
* @param {Object} resType
*/
function request(url,method,data,header,resType) {
return new Promise((resolve,reject)=>{
uni.request({
url: Url() + url,
method: method || 'GET',
data: data || {},
header: header || {},
responseType: resType,
success: (res)=>{
if(res.data.code===401) { //请求接口返回401(token异常)后直接返回401
resolve(401)
}else {
resolve(res); //没有401时返回响应数据
}
},
fail: (err)=>{
reject(err);
}
})
})
}
/**
* export请求;请求重试机制
* @param {Object} url
* @param {Object} method
* @param {Object} data
* @param {Object} headers
* @param {Object} resType
*/
export default (url,method,data,header,resType)=>{
return new Promise((resolve,reject)=>{
request(url,method,data,headers(header),resType).then(res=>{
if(res===401) { //接口请求401,401是request请求手动抛出的401
getToken().then(res=>{ //接口重试,在获取到token以后对请求失败的接口再次请求;这儿可以根据自己的需要自己定义
request(url,method,data,headers(header),resType).then(res=>{
resolve(res)
})
})
}else { //没有token异常时直接返回响应数据
resolve(res)
}
}).catch(err=>{reject(err)})
})
}