service.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * @version 3.0.7
  3. * @Author lu-ch
  4. * @Date 2021-09-04
  5. * @Email webwork.s@qq.com
  6. * 文档: https://www.quanzhan.co/luch-request/
  7. * github: https://github.com/lei-mu/luch-request
  8. * DCloud: http://ext.dcloud.net.cn/plugin?id=392
  9. * HBuilderX: beat-3.0.4 alpha-3.0.4
  10. */
  11. import { // 局部引入
  12. auth
  13. } from './api.js'
  14. import Config from '@/utils/config.js'
  15. import Request from '../index.js'
  16. const http = new Request({
  17. validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置
  18. return (statusCode >= 200 && statusCode < 300) || statusCode == 401
  19. }
  20. })
  21. http.setConfig((config) => { /* 设置全局配置 */
  22. config.baseURL = Config.apiUrl
  23. config.header = {
  24. ...config.header,
  25. ContentType: 'application/json;charset=UTF-8',
  26. ContentType: 'application/x-www-form-urlencoded',
  27. 'Accept-Language': 'zh-CN,zh',
  28. 'X-Requested-With': 'XMLHttpRequest'
  29. }
  30. return config
  31. })
  32. http.interceptors.request.use((config) => { /* 请求之前拦截器。可以使用async await 做异步操作 */
  33. config.header = {
  34. ...config.header,
  35. 'token': getTokenStorage()
  36. }
  37. /*
  38. if (!token) { // 如果token不存在,return Promise.reject(config) 会取消本次请求
  39. return Promise.reject(config)
  40. }
  41. */
  42. return config
  43. }, (config) => {
  44. return Promise.reject(config)
  45. })
  46. http.interceptors.response.use(async (response) => { /* 请求之后拦截器。可以使用async await 做异步操作 */
  47. // if (response.data.code !== 200) { // 服务端返回的状态码不等于200,则reject()
  48. // return Promise.reject(response)
  49. // }
  50. const {
  51. statusCode,
  52. config
  53. } = response
  54. try {
  55. return await handleCode(response, statusCode, config)
  56. } catch (err) {
  57. return Promise.reject(err)
  58. }
  59. return response
  60. }, (response) => { // 请求错误做点什么。可以使用async await 做异步操作
  61. console.log(response)
  62. return Promise.reject(response)
  63. })
  64. /**
  65. * 获取 token
  66. * @return {string}
  67. */
  68. const getTokenStorage = () => {
  69. return uni.getStorageSync('equipment_token') || ''
  70. }
  71. /**
  72. * 重新请求更新获取 `token`
  73. * @param {number} uid
  74. * @return {Promise}
  75. */
  76. const getApiToken = () => {
  77. let params = { // 重新授权登录
  78. code: uni.getStorageSync('equipment_code') || '',
  79. openid: uni.getStorageSync('equipment_openid') || '',
  80. token: uni.getStorageSync('equipment_token') || '',
  81. }
  82. return auth(params).then((res) => {
  83. return res.data
  84. })
  85. }
  86. /**
  87. * 保存 token 到 localStorage
  88. * @param {object} data
  89. */
  90. const saveTokenOpenid = (data) => {
  91. uni.setStorageSync('equipment_token', data.token)
  92. if (data.openid != '') {
  93. uni.setStorageSync('equipment_openid', data.openid)
  94. }
  95. }
  96. /**
  97. * 处理 http状态码
  98. * @param {object} o
  99. * @param {object} o.res 请求返回的数据
  100. * @param {object} o.config 本次请求的config数据
  101. * @param {string|number} o.statusCode http状态码
  102. * @return {object|Promise<reject>}
  103. */
  104. const handleCode = (res, statusCode, config) => {
  105. const STATUS = {
  106. '200'() {
  107. if (res.data.code == 1) {
  108. return res.data
  109. } else {
  110. return Promise.reject(res.data)
  111. }
  112. },
  113. '401'() {
  114. // 定义实例发送次数
  115. if (!config.hasOwnProperty("count")) {
  116. config.count = 0
  117. }
  118. // 只让这个实例发送一次请求,如果code还是401则抛出错误
  119. if (config.count === 1) {
  120. return Promise.reject(res)
  121. }
  122. config.count++; // count字段自增,可以用来判断请求次数,避免多次发送重复的请求
  123. return getApiToken()
  124. .then(saveTokenOpenid)
  125. .then(() => http.request(config))
  126. }
  127. }
  128. return STATUS[statusCode] ? STATUS[statusCode]() : Promise.reject(res) // 有状态码但不在这个封装的配置里,就直接进入 `fail`
  129. }
  130. export {
  131. http
  132. }