http.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import axios from 'axios'
  2. import qs from 'qs'
  3. // import _ from 'lodash'
  4. import merge from 'lodash/merge'
  5. import { Message } from 'element-ui'
  6. /**
  7. * 统一进行异常输出
  8. * 如果异常只是弹框显示即可,可使用该实例
  9. */
  10. const httpConfig = {
  11. timeout: 1000 * 30,
  12. withCredentials: true,
  13. headers: {
  14. 'Content-Type': 'application/json; charset=utf-8'
  15. }
  16. }
  17. const httpCustom = axios.create(httpConfig)
  18. /**
  19. *对于出现异常时还需要做其他操作,可使用该实例
  20. */
  21. const http = axios.create(httpConfig)
  22. /**
  23. * 封装的异常对象
  24. * @param message
  25. * @param code
  26. * @constructor
  27. *
  28. */
  29. function EipException (message, code) {
  30. this.msg = message
  31. this.code = code
  32. }
  33. /**
  34. * 请求拦截
  35. */
  36. http.interceptors.request.use(config => {
  37. return {
  38. ...config,
  39. ...merge(httpConfig, window.BS_CONFIG?.httpConfigs)
  40. }
  41. }, error => {
  42. return Promise.reject(error)
  43. })
  44. /**
  45. * 自定义请求拦截
  46. */
  47. httpCustom.interceptors.request.use(config => {
  48. return config
  49. }, error => {
  50. return Promise.reject(error)
  51. })
  52. /**
  53. * 响应拦截
  54. */
  55. http.interceptors.response.use(response => {
  56. const res = response.data
  57. // 异常拦截
  58. // eslint-disable-next-line no-empty
  59. if (res && res.code === 401) {
  60. } else if (res && res.code !== 200) {
  61. // return Promise.reject(response.data.msg)
  62. Message({
  63. message: response.data.msg,
  64. type: 'error'
  65. })
  66. throw new EipException(response.data.msg, response.data.code)
  67. } else {
  68. return res
  69. }
  70. }, error => {
  71. if (error.message && error.message === 'Network Error') {
  72. Message({
  73. message: error.message,
  74. type: 'error'
  75. })
  76. return Promise.reject(error)
  77. // eslint-disable-next-line no-empty
  78. } else {
  79. }
  80. Message({
  81. message: '服务异常',
  82. type: 'error'
  83. })
  84. return Promise.reject(error)
  85. })
  86. /**
  87. * 响应拦截
  88. */
  89. httpCustom.interceptors.response.use(response => {
  90. const res = response.data
  91. return res
  92. }, error => {
  93. if (error.message && error.message === 'Network Error') {
  94. return Promise.reject(error)
  95. // eslint-disable-next-line no-empty
  96. } else {
  97. }
  98. Message({
  99. message: '服务异常',
  100. type: 'error'
  101. })
  102. return Promise.reject(error)
  103. })
  104. /**
  105. * get请求
  106. * @param url
  107. * @param params
  108. * @returns {Promise<any>}
  109. */
  110. export function get (url, params = {}, customHandlerException = false) {
  111. if (!url.startsWith('http')) {
  112. url = window.BS_CONFIG?.httpConfigs?.baseURL + url
  113. }
  114. // 如果是ie浏览器要添加个时间戳,解决浏览器缓存问题
  115. if (!!window.ActiveXObject || 'ActiveXObject' in window) {
  116. params._t = new Date().getTime()
  117. }
  118. const axiosInstance = customHandlerException ? httpCustom : http
  119. return new Promise((resolve, reject) => {
  120. axiosInstance.get(url, {
  121. params: params,
  122. paramsSerializer: params => {
  123. return qs.stringify(params, { indices: false })
  124. }
  125. }).then(response => {
  126. if (customHandlerException) {
  127. resolve(response)
  128. } else {
  129. resolve(response.data)
  130. }
  131. }).catch(err => {
  132. reject(err)
  133. })
  134. })
  135. }
  136. /**
  137. * Post 请求
  138. * @param url
  139. * @param params
  140. * @returns {Promise<any>}
  141. */
  142. export function post (url, data = {}, customHandlerException = false) {
  143. if (!url.startsWith('http')) {
  144. url = window.BS_CONFIG?.httpConfigs?.baseURL + url
  145. }
  146. const axiosInstance = customHandlerException ? httpCustom : http
  147. data = JSON.stringify(data)
  148. return new Promise((resolve, reject) => {
  149. axiosInstance.post(url, data).then(response => {
  150. if (customHandlerException) {
  151. resolve(response)
  152. } else {
  153. resolve(response.data)
  154. }
  155. }).catch(err => {
  156. reject(err)
  157. })
  158. })
  159. }
  160. /**
  161. * download 请求
  162. * @returns {Promise<any>}
  163. */
  164. export function download (url, headers = {}, params = {}, body = {}) {
  165. if (!url.startsWith('http')) {
  166. url = window.BS_CONFIG?.httpConfigs?.baseURL + url
  167. }
  168. // 如果是ie浏览器要添加个时间戳,解决浏览器缓存问题
  169. if (!!window.ActiveXObject || 'ActiveXObject' in window) {
  170. params._t = new Date().getTime()
  171. }
  172. return new Promise((resolve, reject) => {
  173. axios({
  174. method: 'post',
  175. url: url,
  176. headers: headers,
  177. params: params,
  178. data: body,
  179. withCredentials: false,
  180. responseType: 'arraybuffer'
  181. }).then(res => {
  182. // IE10,11采用自带下载文件流方法
  183. if ((!!window.ActiveXObject || 'ActiveXObject' in window) && window.navigator && window.navigator.msSaveOrOpenBlob) {
  184. window.navigator.msSaveOrOpenBlob(new Blob([res.data]), res.headers.filename)
  185. return
  186. }
  187. const fileUrl = window.URL.createObjectURL(new Blob([res.data]))
  188. // 创建超链接
  189. const fileLink = document.createElement('a')
  190. fileLink.href = fileUrl
  191. // 设置下载文件名
  192. let responseFileName = res.headers.filename
  193. // 解决中文乱码
  194. responseFileName = window.decodeURI(responseFileName)
  195. fileLink.setAttribute('download', responseFileName)
  196. document.body.appendChild(fileLink)
  197. // 模拟人工点击下载超链接
  198. fileLink.click()
  199. // 释放资源
  200. document.body.removeChild(fileLink)
  201. window.URL.revokeObjectURL(fileUrl)
  202. }).catch(e => {
  203. const status = e?.response?.status
  204. if (status === 404) {
  205. Message({
  206. message: '文件不存在或已被删除',
  207. type: 'error'
  208. })
  209. return
  210. }
  211. Message({
  212. message: '服务异常',
  213. type: 'error'
  214. })
  215. console.error('服务异常')
  216. })
  217. })
  218. }