暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

vue 之 axios的封装

晓组智 2021-03-16
1245

axios的封装

在vue项目开发中,和后台交互获取数据中,我们通常使用的是axios库。但是原生的axios可能对项目的适配不友好,所以在项目开始的时候封装一下axios,保持全项目数据处理的统一性。

1、下载axios

  1. npm i axios -S


  2. // 或者淘宝镜像


  3. cnpm install axios -S


下载过后在min.js文件配置

  1. //main.js

  2. import axios from "axios";


2.配置config文件中的代理地址

在项目目录下的修改 config.js文件,这里是主要书写配置多个后台接口 or 跨域。

  1. module.exports = {


  2. publicPath: publicPath,


  3. lintOnSave: false,


  4. configureWebpack: configureSetWebpack,


  5. devServer: {

  6. publicPath,

  7. proxy: {

  8. '/api': {

  9. target: DOMAIN, // 后端接口地址


  10. changeOrigin: true, // 是否允许跨越,


  11. ws: false,

  12. pathRewrite: {


  13. '^/api': '/api', // 重写,


  14. },

  15. },

  16. },

  17. },

  18. ....

  19. }


3.封装axios实例 : index.js

在项目src目录下新建api文件夹,然后在其中新建 index.js文件,这个文件是主要书写axios的封装过程。

  1. import axios from 'axios'

  2. // 引入axios

  3. import Vue from 'vue'


  4. import router from '../router'


  5. import configUrl from './configUrl'



  6. import {

  7. SSL_OP_NO_TLSv1_1

  8. } from 'constants'

  9. // 创建一个 axios 实例(接口)

  10. const ajx = axios.create({


  11. baseURL: process.env.NODE_ENV == 'scrm' ? configUrl.ajax_url : window.location.origin + '/api/',


  1. timeout: 1000 * 300,


  2. withCredentials: true,


  3. headers: {

  4. Accept: 'application/json',


  5. 'X-Channel': configUrl.channelId,


  6. 'X-Channel-Type': SSL_OP_NO_TLSv1_1,


  7. 'Content-Security-Policy': 'upgrade-insecure-requests',


  8. },

  9. })


  10. // 请求封装


  11. let loading = null;


  12. ajx.interceptors.request.use(


  13. (config) => {


  14. let data = {}


  15. if (config.hasOwnProperty('data')) {


  16. if (typeof config.data == String) {


  17. data = JSON.parse(config.data)


  18. } else {

  19. data = config.data

  20. }

  21. if (data.loadingClose == true) {


  22. loading = null

  23. } else {

  24. loading = Vue.prototype.$loading({


  25. lock: true,

  26. text: '加载中',

  27. spinner: 'el-icon-loading',

  28. background: 'rgba(0, 0, 0, 0.6)',


  29. })

  30. }

  31. if (config.data.ISUPLOAD) {

  32. // 如果请求中带有ISUPLOAD参数则罢

  33. Content-Type值换成form-data


  34. let data = {

  35. ...config

  36. }

  37. config.data = data.data.data


  38. config.headers['Content-Type'] = "multipart/form-data"


  39. return config


  40. }

  41. } else {

  42. loading = Vue.prototype.$loading({


  43. lock: true,

  44. text: '加载中',

  45. spinner: 'el-icon-loading',

  46. background: 'rgba(0, 0, 0, 0.6)',


  47. })

  48. }


  49. // 全局加loading,提交时加loading


  50. const token = cookieGet('token')


  51. if (token != null || token != undefined) {


  52. if (cookieGet('Httpheader')) {


  53. config.headers = JSON.parse(cookieGet('Httpheader'))



  54. } else {

  55. config.headers = {


  56. 'Content-Type': 'application/json;charset=UTF-8',



  57. 'X-Channel-Type': SSL_OP_NO_TLSv1_1,


  58. 'X-Channel': configUrl.channelId,


  59. 'X-Security-Token': token,

  60. }

  61. }

  62. }

  63. return config

  64. },

  65. (error) => Promise.error(error)

  66. )


  67. ajx.interceptors.response.use(


  68. (res) => {

  69. if (res) {

  70. // 清除loading

  71. if (loading) {

  72. loading.close()

  73. loading = null

  74. }


  75. return res

  76. }

  77. return Promise.reject('接口报错')


  78. },

  79. (error) => {

  80. if (error) {

  81. // 清除loading

  82. if (loading) {

  83. loading.close()

  84. loading = null

  85. }

  86. if (error.response.data.code == 50101) {


  87. // 登录超时,跳回登录页


  88. localStorage.setItem('clearlogin', true)


  89. router.replace('/login')

  90. }


  91. let msg = '接口请求错误'


  92. if (error.response) {


  93. msg = error.response.data.message


  94. }

  95. Vue.prototype.$notify.error({


  96. title: '错误',

  97. message: msg,

  98. })


  99. return Promise.reject(msg)


  100. }

  101. return null

  102. }

  103. )





  104. export function HttpGet(url, params = {}) {


  105. return new Promise((resolve, reject) => {


  106. ajx

  107. .get(url, {

  108. params,

  109. })

  110. .then((response) => {

  111. resolve(response.data)

  112. })

  113. .catch((err) => {

  114. reject(err)

  115. })

  116. })

  117. }


  118. export function HttpPost(url, data = {}) {


  119. return new Promise((resolve, reject) => {


  120. ajx.post(url, data).then(

  121. (response) => {

  122. if (url == 'user/signin') {


  123. // 登录,把请求头返回

  124. resolve(response)

  125. } else {

  126. resolve(response.data)

  127. }

  128. },

  129. (err) => {

  130. reject(err)

  131. }

  132. )

  133. })

  134. }


  135. export function HttpPatch(url, data = {}) {


  136. return new Promise((resolve, reject) => {


  137. ajx.patch(url, data).then(

  138. (response) => {

  139. resolve(response.data)

  140. },

  141. (err) => {

  142. reject(err)

  143. }

  144. )

  145. })

  146. }


  147. export function HttpPut(url, data = {}) {


  148. return new Promise((resolve, reject) => {


  149. ajx.put(url, data).then(

  150. (response) => {

  151. resolve(response.data)

  152. },

  153. (err) => {

  154. reject(err)

  155. }

  156. )

  157. })

  158. }

  159. export function HttpDelete(url, data = {}) {


  160. return new Promise((resolve, reject) => {


  161. ajx.delete(url, data).then(

  162. (response) => {

  163. resolve(response.data)

  164. },

  165. (err) => {

  166. reject(err)

  167. }

  168. )

  169. })

  170. }


4.调用封装

在项目src目录下api文件夹,然后在其中新建 调用模块文件,这个文件是主要书写调用那些接口。

如上图为列;在automation.js文件中先引入你在index.js里封装的axios

  1. import {

  2. HttpGet,

  3. HttpPost,

  4. HttpPut,

  5. HttpDelete

  6. } from '../index'


  7. const apis = {

  8. listone: 'user/index/list/one' // 自定义事件

  9. }

  10. // 自定义事件列表

  11. export const listone= (params) => HttpGet(apis.listone + params)


如上述代码看出 先import 导入封装的axios的方法;其次再apis对象里定义具体接口;最后再 export 出 此接口用什么方法调取。

5.如何在vue文件中调用

  1. import { intelligentlist } from '@/api/automation/automation'



  2. methods: {

  3. getautomlist() {

  4. intelligentlist({

  5. page:1,

  6. size:10

  7. }).then(res => {

  8. if (res.code == 0) {

  9. .....

  10. }

  11. })

  12. },

  13. }


这样就完成了一次axios封装与使用;适合大中型项目,如果是自己小项目,就直接用axios就ok了。。。

 


文章转载自晓组智,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论