service.js 2.4 KB

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