request.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. * @Author: Rindy
  3. * @Date: 2021-04-25 15:58:21
  4. * @LastEditors: Rindy
  5. * @LastEditTime: 2021-05-08 15:49:54
  6. * @Description: 注释
  7. */
  8. /*
  9. code message
  10. -5 系统繁忙,请稍后再试!
  11. -4 跨服务请求失败
  12. -3 缺少必要参数
  13. 5005 场景为空
  14. 5012 数据不正常
  15. 5018 zip文件只能有一层目录或无目录
  16. 5019 必须有且仅有一个obj和mtl文件
  17. 5020 贴图需控制在1.5M以内,obj文件需要控制在20M以内。
  18. 5021 场景密钥不正确
  19. 5025 数据包不存在,请先打成zip包
  20. 5039 画墙重建模型失败
  21. 5043 打包zip失败
  22. 5059 该压缩包无可用obj或者mtl文件
  23. 5060 obj文件名应为mesh.obj
  24. 5062 无可用jpg文件
  25. 7004 热点数据不能为空!
  26. 7005 查询不到热点数据!
  27. 7006 目录不存在!
  28. 7007 文件格式不正确
  29. 7009 球幕视频文件不存在
  30. 7010 相机或者相机详情不存在
  31. 7012 上传的文件名错误
  32. 7013 上传失败
  33. 7015 仅支持.zip文件上传
  34. 7016 仅支持.mp4格式文件
  35. 7018 压缩包内请勿包含文件夹
  36. 4001 无token,请重新登录
  37. 4002 token不合法
  38. 4003 用户未登录
  39. */
  40. import axios from 'axios'
  41. import browser from './browser'
  42. let fetch = null
  43. Promise.prototype.done = Promise.prototype.then
  44. Promise.prototype.fail = Promise.prototype.catch
  45. // TextDecoder polyfills for lower browser
  46. if (undefined === window.TextEncoder) {
  47. window.TextEncoder = class _TextEncoder {
  48. encode(s) {
  49. return unescape(encodeURIComponent(s))
  50. .split('')
  51. .map(function (val) {
  52. return val.charCodeAt()
  53. })
  54. }
  55. }
  56. window.TextDecoder = class _TextDecoder {
  57. decode(code_arr) {
  58. return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)))
  59. }
  60. }
  61. }
  62. const http = {
  63. retry(func, retries = 0, delay = 1000) {
  64. return new Promise((resolve, reject) => {
  65. func()
  66. .then(resolve)
  67. .catch(error => {
  68. if (retries <= 1) {
  69. reject(error)
  70. } else {
  71. setTimeout(() => {
  72. http.retry(func, retries - 1, delay)
  73. .then(resolve)
  74. .catch(reject)
  75. }, delay)
  76. }
  77. })
  78. })
  79. },
  80. get(url) {
  81. return fetch.get(url)
  82. },
  83. getImage(url, retries = 3) {
  84. return http.retry(
  85. () =>
  86. new Promise((resolve, reject) => {
  87. let img = new Image()
  88. img.crossOrigin = 'anonymous'
  89. img.src = url
  90. img.onload = function () {
  91. resolve(img)
  92. }
  93. img.onerror = function () {
  94. reject(`[${url}] load fail`)
  95. }
  96. }),
  97. retries
  98. )
  99. },
  100. getText(url) {
  101. return fetch.get(url, {
  102. responseType: 'text',
  103. })
  104. },
  105. getBueffer(url) {
  106. return fetch.get(url, {
  107. responseType: 'arraybuffer',
  108. })
  109. },
  110. getBlob(url) {
  111. return fetch.get(url, {
  112. responseType: 'blob',
  113. })
  114. },
  115. post(url, data) {
  116. return fetch.post(url, data)
  117. },
  118. postFile(url, data) {
  119. const form = new FormData()
  120. let cb = null
  121. if (data.onUploadProgress) {
  122. cb = data.onUploadProgress
  123. delete data.onUploadProgress
  124. }
  125. for (let key in data) {
  126. if (key === 'files' && data[key].length > 0) {
  127. for (let i = 0; i < data[key].length; i++) {
  128. let file = data[key][i]
  129. if (file instanceof File) {
  130. form.append(key, file)
  131. } else if (file.file) {
  132. if (file.filename) {
  133. form.append(key, file.file, file.filename)
  134. } else {
  135. form.append(key, file.file)
  136. }
  137. } else {
  138. console.warn('file is wong !', data)
  139. }
  140. }
  141. } else if (key == 'file' || key === 'filename') {
  142. if (key == 'file') {
  143. if (data.filename) {
  144. form.append('file', data[key], data.filename)
  145. } else {
  146. form.append('file', data[key])
  147. }
  148. }
  149. } else {
  150. form.append(key, data[key])
  151. }
  152. }
  153. return fetch.post(url, form, {
  154. headers: {
  155. 'Content-Type': 'multipart/form-data',
  156. },
  157. onUploadProgress: cb,
  158. })
  159. },
  160. }
  161. export function setup(options = {}) {
  162. fetch = axios.create({
  163. baseURL: options.server || '/',
  164. })
  165. fetch.interceptors.request.use(
  166. config => {
  167. let token = browser.valueFromUrl('token') || localStorage.getItem('token') || ''
  168. if (token) {
  169. config.headers['token'] = token
  170. }
  171. return config
  172. },
  173. error => {
  174. return Promise.reject(error)
  175. }
  176. )
  177. fetch.interceptors.response.use(
  178. response => {
  179. // 正常的文件流
  180. if (!/json/gi.test(response.headers['content-type'])) {
  181. return response.data
  182. }
  183. // 以文件流方式请求但是返回json,需要解析为JSON对象
  184. if (response.request.responseType === 'arraybuffer') {
  185. let enc = new TextDecoder('utf-8')
  186. let res = JSON.parse(enc.decode(new Uint8Array(response.data)))
  187. return res
  188. }
  189. if(response.code==4008){
  190. //用户未登录
  191. }
  192. return response.data
  193. },
  194. error => {
  195. if (error.response && error.response.data) {
  196. return Promise.reject(error.response)
  197. }
  198. return Promise.reject(error)
  199. }
  200. )
  201. }
  202. export { http }