request.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import axios from 'axios'
  2. // TextDecoder polyfills for lower browser
  3. if (undefined === window.TextEncoder) {
  4. window.TextEncoder = class _TextEncoder {
  5. encode(s) {
  6. return unescape(encodeURIComponent(s))
  7. .split('')
  8. .map(function (val) {
  9. return val.charCodeAt()
  10. })
  11. }
  12. }
  13. window.TextDecoder = class _TextDecoder {
  14. decode(code_arr) {
  15. return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)))
  16. }
  17. }
  18. }
  19. const fetch = axios.create()
  20. fetch.interceptors.request.use(
  21. config => {
  22. config.headers['token'] = 123
  23. return config
  24. },
  25. error => {
  26. return Promise.reject(error)
  27. }
  28. )
  29. fetch.interceptors.response.use(
  30. response => {
  31. // 正常的文件流
  32. if (!/json/gi.test(response.headers['content-type'])) {
  33. return response.data
  34. }
  35. // 以文件流方式请求但是返回json,需要解析为JSON对象
  36. if (response.request.responseType === 'arraybuffer') {
  37. let enc = new TextDecoder('utf-8')
  38. let res = JSON.parse(enc.decode(new Uint8Array(response.data)))
  39. return res
  40. }
  41. return response.data
  42. },
  43. error => {
  44. console.error(error)
  45. }
  46. )
  47. const http = {
  48. retry(func, retries = 0, delay = 1000) {
  49. return new Promise((resolve, reject) => {
  50. func()
  51. .then(resolve)
  52. .catch(error => {
  53. if (retries <= 1) {
  54. reject(error)
  55. } else {
  56. setTimeout(() => {
  57. http.retry(func, retries - 1, delay)
  58. .then(resolve)
  59. .catch(reject)
  60. }, delay)
  61. }
  62. })
  63. })
  64. },
  65. get(url) {
  66. return fetch.get(url)
  67. },
  68. getImage(url, retries = 3) {
  69. return http.retry(
  70. () =>
  71. new Promise((resolve, reject) => {
  72. let img = new Image()
  73. img.src = url
  74. img.crossOrigin = 'anonymous'
  75. img.onload = function () {
  76. resolve(img)
  77. }
  78. img.onerror = function () {
  79. reject(`[${url}] load fail`)
  80. }
  81. }),
  82. retries
  83. )
  84. },
  85. getBueffer(url) {
  86. return fetch.get(url, {
  87. responseType: 'arraybuffer',
  88. })
  89. },
  90. getBlob(url) {
  91. return fetch.get(url, {
  92. responseType: 'blob',
  93. })
  94. },
  95. post(url, data) {
  96. return fetch.post(url, data)
  97. },
  98. postFile(url, data) {
  99. const form = new FormData()
  100. let cb = null
  101. if (data.onUploadProgress) {
  102. cb = data.onUploadProgress
  103. delete data.onUploadProgress
  104. }
  105. for (let key in data) {
  106. // if (key === 'files' && data[key].length > 0) {
  107. // for (let i = 0; i < data[key].length; i++) {
  108. // form.append(key, data[key][i])
  109. // }
  110. // } else {
  111. // form.append(key, data[key])
  112. // }
  113. form.append(key, data[key])
  114. }
  115. return fetch.post(url, form, {
  116. headers: {
  117. 'Content-Type': 'multipart/form-data',
  118. },
  119. onUploadProgress: cb,
  120. })
  121. },
  122. }
  123. export { http, fetch }