service.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import Request from 'luch-request'
  2. import Global from "./global.js"
  3. import crypto from '@/utils/crypto.js'
  4. let baseURL = Global.baseUrl
  5. let tokenUrl = Global.tokenUrl
  6. //获取token
  7. const getTokenStorage = () => {
  8. let token = ''
  9. try {
  10. token = uni.getStorageSync('token')
  11. } catch (e) {}
  12. return token
  13. }
  14. const http = new Request()
  15. http.setConfig((config) => {
  16. /* 设置全局配置 */
  17. config.baseURL = baseURL /* 根域名不同 */
  18. config.header = {
  19. ...config.header,
  20. }
  21. return config
  22. })
  23. http.interceptors.request.use((config) => {
  24. /* 请求之前拦截器。可以使用async await 做异步操作 */
  25. config.header = {
  26. ...config.header,
  27. "Blade-Auth": getTokenStorage()
  28. }
  29. // 1:开启加密
  30. // 2:post请求
  31. // 3:请求体不为空
  32. // 4: url不在白名单内
  33. if (Global.enabledCrypto && config.method == 'POST' && config.data && crypto.isNotInWhiteList(config.url)) {
  34. //报文加密
  35. let encrypt= crypto.encrypt(JSON.stringify(config.data))
  36. config.data=encrypt
  37. }
  38. return config
  39. }, (config) => {
  40. return Promise.reject(config)
  41. })
  42. // 是否正在刷新的标记
  43. let isRefreshing = false
  44. // 重试队列,每一项将是一个待执行的函数形式
  45. let requests = []
  46. http.interceptors.response.use(async (response) => {
  47. /* 请求之后拦截器。可以使用async await 做异步操作 */
  48. //toekn过期处理
  49. //200 返回数据成功 0
  50. if (response.data.code != 200 && response.data.code !=400) {
  51. return Promise.reject(response)
  52. }
  53. return response.data
  54. }, async (err) => { // 请求错误做点什么
  55. if (err.data.code == 401) {
  56. let {
  57. config
  58. } = err
  59. if (!isRefreshing) {
  60. isRefreshing = true
  61. let token = uni.getStorageSync('token')
  62. let [, res] = await uni.request({
  63. url: tokenUrl,
  64. method: 'POST',
  65. header: {
  66. Authorization: "Basic c2FiZXI6c2FiZXJfc2VjcmV0"
  67. },
  68. })
  69. //否则保存新的token
  70. token = res.data.token_type + " " + res.data.access_token
  71. uni.setStorageSync('token', token)
  72. requests.forEach(cb => cb())
  73. // 重试完了清空这个队列
  74. requests = []
  75. isRefreshing = false
  76. return http.request(config)
  77. } else {
  78. return new Promise((resolve) => {
  79. // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
  80. requests.push(() => {
  81. resolve(http.request(config))
  82. })
  83. })
  84. }
  85. }
  86. uni.showToast({
  87. icon: 'none',
  88. position: 'bottom',
  89. title: '网络异常'
  90. })
  91. return Promise.reject(err)
  92. })
  93. export {
  94. http
  95. }