uniapp中request请求token失效后重新获取token且重新请求

        在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)})
	})
}

你可能感兴趣的:(uni-app)