当前位置:   article > 正文

史上最全的 axios 工具封装_react 最全的aoxis 封装

react 最全的aoxis 封装

npm使用国内淘宝镜像的方法

npm install -g cnpm --registry=https://registry.npm.taobao.org

npm 导入axios 包

cnpm install axios -save
  • 封装要点
    • 统一的url配置
    • 统一的api请求
    • request(请求)拦截器。例如:带上token等,设置请求头
    • respon (响应) 拦截器。 例如:统一错误处理,页面重定向等
    • 根据需求,结合vue做全局的loading动画,或者错误处理
    • 将axios封装成Vue插件使用

config.js axios默认配置,包含基础路径信息等

  1. import { baseUrl } from '@/utils/global'
  2. export default {
  3. method: 'get',
  4. // 基础url前缀
  5. baseUrl: baseUrl,
  6. // 请求头信息
  7. headers: {
  8. 'Content-Type': 'application/json;charset=UTF-8'
  9. },
  10. // 参数
  11. data: {},
  12. // 设置超时时间
  13. timeout: 10000,
  14. // 携带凭证
  15. withCredentials: true,
  16. // 返回数据类型
  17. responseType: 'json'
  18. }

axios.js 二次封装axios模块,包含拦截器等信息

  1. import axios from 'axios';
  2. import config from './config';
  3. import Cookies from "js-cookie";
  4. import router from '@/router'
  5. export default function $axios(options) {
  6. return new Promise((resolve, reject) => {
  7. const instance = axios.create({
  8. baseURL: config.baseUrl,
  9. headers: config.headers,
  10. timeout: config.timeout,
  11. withCredentials: config.withCredentials
  12. })
  13. // request 请求拦截器
  14. instance.interceptors.request.use(
  15. config => {
  16. let token = Cookies.get('token')
  17. // 发送请求时携带token
  18. if (token) {
  19. config.headers.token = token
  20. } else {
  21. // 重定向到登录页面
  22. router.push('/login')
  23. }
  24. return config
  25. },
  26. error => {
  27. // 请求发生错误时
  28. console.log('request:', error)
  29. // 判断请求超时
  30. if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
  31. console.log('timeout请求超时')
  32. }
  33. // 需要重定向到错误页面
  34. const errorInfo = error.response
  35. console.log(errorInfo)
  36. if (errorInfo) {
  37. error = errorInfo.data // 页面那边catch的时候就能拿到详细的错误信息,看最下边的Promise.reject
  38. const errorStatus = errorInfo.status; // 404 403 500 ...
  39. router.push({
  40. path: `/error/${errorStatus}`
  41. })
  42. }
  43. return Promise.reject(error) // 在调用的那边可以拿到(catch)你想返回的错误信息
  44. }
  45. )
  46. // response 响应拦截器
  47. instance.interceptors.response.use(
  48. response => {
  49. return response.data
  50. },
  51. err => {
  52. if (err && err.response) {
  53. switch (err.response.status) {
  54. case 400:
  55. err.message = '请求错误'
  56. break
  57. case 401:
  58. err.message = '未授权,请登录'
  59. break
  60. case 403:
  61. err.message = '拒绝访问'
  62. break
  63. case 404:
  64. err.message = `请求地址出错: ${err.response.config.url}`
  65. break
  66. case 408:
  67. err.message = '请求超时'
  68. break
  69. case 500:
  70. err.message = '服务器内部错误'
  71. break
  72. case 501:
  73. err.message = '服务未实现'
  74. break
  75. case 502:
  76. err.message = '网关错误'
  77. break
  78. case 503:
  79. err.message = '服务不可用'
  80. break
  81. case 504:
  82. err.message = '网关超时'
  83. break
  84. case 505:
  85. err.message = 'HTTP版本不受支持'
  86. break
  87. default:
  88. }
  89. }
  90. console.error(err)
  91. return Promise.reject(err) // 返回接口返回的错误信息
  92. }
  93. )
  94. // 请求处理
  95. instance(options).then(res => {
  96. resolve(res)
  97. return false
  98. }).catch(error => {
  99. reject(error)
  100. })
  101. })
  102. }

api.js 请求接口汇总模块,聚合所有的API

  1. /*
  2. * 接口统一集成模块
  3. */
  4. import * as login from './modules/login'
  5. import * as user from './modules/user'
  6. import * as dept from './modules/dept'
  7. import * as role from './modules/role'
  8. import * as menu from './modules/menu'
  9. import * as dict from './modules/dict'
  10. import * as config from './modules/config'
  11. import * as log from './modules/log'
  12. import * as loginlog from './modules/loginlog'
  13. // 默认全部导出
  14. export default {
  15. login,
  16. user,
  17. dept,
  18. role,
  19. menu,
  20. dict,
  21. config,
  22. log,
  23. loginlog
  24. }

API user.js 示例

  1. import axios from '../axios'
  2. /*
  3. * 用户管理模块
  4. */
  5. // 保存
  6. export const save = (data) => {
  7. return axios({
  8. url: '/user/save',
  9. method: 'post',
  10. data
  11. })
  12. }
  13. // 删除
  14. export const batchDelete = (data) => {
  15. return axios({
  16. url: '/user/delete',
  17. method: 'post',
  18. data
  19. })
  20. }
  21. // 分页查询
  22. export const findPage = (data) => {
  23. return axios({
  24. url: '/user/findPage',
  25. method: 'post',
  26. data
  27. })
  28. }
  29. // 导出Excel用户信息
  30. export const exportUserExcelFile = (data) => {
  31. return axios({
  32. url: '/user/exportUserExcelFile',
  33. method: 'post',
  34. data
  35. })
  36. }
  37. // 查找用户的菜单权限标识集合
  38. export const findPermissions = (params) => {
  39. return axios({
  40. url: '/user/findPermissions',
  41. method: 'get',
  42. params
  43. })
  44. }
  45. // 根据用户名查找
  46. export const findByName = (params) => {
  47. return axios({
  48. url: '/user/findByName',
  49. method: 'get',
  50. params
  51. })
  52. }
  53. // 更新用户密码
  54. export const updatePassword = (params) => {
  55. return axios({
  56. url: '/user/updatePassword',
  57. method: 'get',
  58. params
  59. })
  60. }

index.js 将axios 封装成插件,按照插件的方式引入

  1. // 导入所有接口
  2. import api from './api'
  3. const install = Vue => {
  4. if (install.installed)
  5. return;
  6. install.installed = true;
  7. Object.defineProperties(Vue.prototype, {
  8. // 注意,此处挂载在 Vue 原型的 $api 对象上
  9. $api: {
  10. get() {
  11. return api
  12. }
  13. }
  14. })
  15. }
  16. export default install
  17. 备注:调用的方式this.$api.子模块.方法

global.js 全局的配置,常量和方法

  1. /**
  2. * 全局常量、方法封装模块
  3. * 通过原型挂载到Vue属性
  4. * 通过 this.Global 调用
  5. */
  6. // 后台管理系统服务器地址
  7. // export const baseUrl = 'http://139.196.87.48:8001'
  8. export const baseUrl = 'http://localhost:8001'
  9. // 系统数据备份还原服务器地址
  10. // export const backupBaseUrl = 'http://139.196.87.48:8002'
  11. export const backupBaseUrl = 'http://localhost:8002'
  12. export default {
  13. baseUrl,
  14. backupBaseUrl
  15. }

main.js 导入api模块,并注册使用,导入global模块,挂载

  1. import Vue from 'vue'
  2. import App from './App'
  3. import router from './router'
  4. import api from './http'
  5. import i18n from './i18n'
  6. import store from './store'
  7. import global from '@/utils/global'
  8. import ElementUI from 'element-ui'
  9. import 'element-ui/lib/theme-chalk/index.css'
  10. import 'font-awesome/css/font-awesome.min.css'
  11. Vue.use(ElementUI) // 注册使用Element
  12. Vue.use(api) // 注册使用API模块
  13. Vue.prototype.global = global // 挂载全局配置模块
  14. new Vue({
  15. el: '#app',
  16. i18n,
  17. router,
  18. store,
  19. render: h => h(App)
  20. })

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号