考虑接口时效性和安全性,后端增设了token验证,确保我们的单个token只使用一次,使用后就立即失效,但是也为了防止在实际进程中异步请求的出现,所以重新封装了请求方法。
要求是在执行某个请求时,如果后端返回408code(token过期),就重新调用一次登录接口刷新token,并重新执行失败的请求。
在app.js中定义post方法,并在globalData中定义一个用于暂存回调的unRequest。
globalData: {
unRequest:null
},
/**请求方法
* @url 请求路径
* @data 请求参数
* @method 不传为post 传为get
* */
post(url,data,method){
let self = this,token = wx.getStorageSync('LOGIN_B_T');
return new Promise((resolve, reject) => {
wx.login({
success: code=>{
wx.request({
url: requestURL + url,
data: data,
header: {
'B-T':token
},
method: method == undefined || method == ''?'POST':'GET',
success(res) {
if(res.statusCode==200){
if(res.data.code==200){
wx.setStorage({
key:'LOGIN_B_T',
data:res.header['B-T']
})
resolve(res.data)
}else if(res.data.code==408){
self.updateToken();
self.globalData.unRequest=function(){
resolve(self.post(url,data,method))
}
}
}
},
fail() {
wx.showToast({
title: '请求发送失败',
icon: "none"
})
}
})
},
})
})
},
//刷新token
updateToken() {
let self = this;
wx.login({
success:rescode=>{
wx.request({
url: requestURL + '/v1/api/imiMini/login',
data: {code:rescode.code},
method: 'POST',
success: function (res) {
if(res.statusCode==200){
if(res.data.code == 200){
self.setSystem(res)
self.globalData.unRequest((callback) => {
callback();
})
}
}
}
})
}
})
},
// 刷新本地storagetoken
setSystem(res){
wx.setStorage({
key:'LOGIN_B_T',
data:res.header['B-T']
})
},
因为以上都是个人项目中的使用,所以有一些个人的内容在里边,简化一下:
globalData: {
unRequest:null,
token:'',//在正确的生态下,进入程序该请求前,会给当前token赋值
},
/**请求方法
* @url 请求路径
* @data 请求参数
* @method 不传为post 传为get
* */
ajax(url,data,method){
let self = this,token = this.globalData.token;
return new Promise((resolve,reject)=>{
wx.request({
url: requestURL + url,
data,
method: method == undefined || method == ''?'POST':'GET',
success: function (res) {
if(res.code==200){
resolve(res.data)
}else if(res.code=='408'){ //token过期
self.updateToken();
self.globalData.unRequest=function(){
resolve(self.post(url,data,method))
}
}else{
reject(res)
}
},
fail:err=>{
reject(err)
}
})
})
},
//更新token
updateToken() {
let self = this;
wx.request({
url: requestURL + '/v1/api/imiMini/login',
data: {code:rescode.code},
method: 'POST',
success: function (res) {
if(res.data.code == 200){
self.globalData.token = res.data.token
self.globalData.unRequest((callback) => {
callback();
})
}
}
})
},