微信小程序搭配wechat-http,实现封装http请求响应拦截器和Promise
- 代码部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71// http.js
// 导入 http 模块
import http from 'wechat-http'
/**
* 配置接口基础路径
*/
http.baseURL = 'https://live-api.itheima.net'
/**
* 挂载方法到全局
*/
wx.http = http
/**
* 配置请求拦截器
*/
http.intercept.request = (config) => {
console.log('config -----> ', config);
const app = getApp()
if (app.token) {
config.header = {
Authorization: `Bearer ${app.token}`,
// 写在后,按用户传递过来的属性为准
...config.header
}
}
return config
}
/**
* 配置响应拦截器
*/
http.intercept.response = async (res) => {
/*
假如返回的是 401,那么代表 token 过期,我们需要发送 refreshToken
*/
if (res.statusCode === 401) {
// 假如 /refreshToken 的请求都失败了,不要再发,请跳转登录页
if (res.config.url.includes('/refreshToken')) {
wx.navigateTo({ url: '/pages/login/index' })
return
}
const app = getApp()
const result = await wx.http({
url: '/refreshToken', method: 'POST', header: {
Authorization: `Bearer ${app.refreshToken}`
}
})
console.log('无感刷新refreshToken -----> ', result);
app.setToken(result.data.token, result.data.refreshToken)
// console.log('token处理完成了 -----> ', res);
// 要么跳转登录页,要么就把数据拿到
// 请求接口可以在 res.config 拿到,注意里面的请求头还是失败的请求头,要修改为可以用的即可
return wx.http({
...res.config,
header: `Bearer ${result.data.token}`
})
}
// 对返回码做判断,10000才是成功,否则要 Promise.reject(res)
if (res.data.code === 10000) {
return res.data
} else {
wx.utils.toast("请求失败")
return Promise.reject(res)
}
}
/**
* 模块导出
*/
export default http
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 戴某人的博客!