一个比较全面的基于axios的封装

本文分享了一个基于axios的全面封装方法,通过自定义请求和响应拦截器,实现了错误处理和状态码映射,适用于各种项目需求。文章还介绍了如何在项目中使用此封装。

以下文章来自于“前端咖”公众号

在几个公司工作过,我发现我很少看到考虑的比较全面的ajax封装。可能是因为我待过的公司不够优秀吧,也可能是因为我所在的团队不够优秀吧。基于这样的一个情况,我觉得我可以写一个比较全面的基于axios的封装。

这里我只分享一个相对比较全面的基于axios的封装,如果想要更符合你项目的封装,还请自己多理解或者和我交流沟通。

「以下是基于axios封装的代码:」


/**
 * http封装请求
 */
import axios from 'axios'

// 超时时间
axios.defaults.timeout = 3000
// http请求拦截器
axios.interceptors.request.use(config => {
  return config
}, error => {
  return Promise.reject(error)
})
let erorrMap = {
  'CMN00000': '成功',
  'CMN00001': '输入参数为空',
  'CMN00002': '输入参数校验失败'
}
// http响应拦截器
axios.interceptors.response.use(res => {
  let code = res.data.code
  if (code === 'CMN00000') {
  } else {
    if (erorrMap[code]) {
      //erorrMap[code]
    } else {
      //'未知错误'
    }
  }
  return res
}, async (error) => {
  if (error.request) {
    if (error.request.status === 0) {
      debugger
      //超时
    }
  } else if (error.response) {
    if (error.response.status === 400) {

    } else if (error.response.status === 404) {
      //未找到资源
    } else if (error.response.status === 401) {
      //'请先登录'
    } else if (error.response.status === 500) {
      //'服务器异常'
    }
  }
  return Promise.reject(error)
})

let request = (config) => {
  /*let token = window.localStorage.getItem('token')
  axios.defaults.headers.common['token'] = token || ''*/
  return axios.request(
    Object.assign({
        method: 'post',
        data: {},
        params: {}
      },
      config
    )
  )
}

export default request

「基于上面的封装,我详细的做一个讲解:」

1,http请求拦截器中的第一个参数是一个函数,在其中可以给每一个请求做一些配置项的处理,比如加时间戳等等。

2,http响应拦截器中的第一个参数同样是一个函数,在其中可以处理http响应code是200时正常或者异常的情况。

3,http响应拦截器中的第二个参数同样是一个函数,在其中可以处理除了http响应code是200以外的情况,比如未登录时的401,可以跳出需要登录才可以查看操作的页面等等。

4,request方法的定义中可以在头headers中加一些token之类配置。

「当然光知道上面的基于axois的封装还不够,还得知道如何使用该封装,代码如下:」

import request from './request'
import * as url from './url'

request(
  {
    url: url.apiRegister
  }
).then((res) => {
  let code = res.data.code
  if (code === 'CMN00000') {
    //成功
  } else {
  }
}).catch((error) => {
  if (error.response) {
  } else if (error.request) {
  } else {
    console.log(error)
  }
})

「使用基于axios的封装,我详细介绍一下:」

1,request的返回的是一个promise实例,then方法中是处理http响应code是200的情况,该情况下又分成正常和异常。

2,catch方法中可以处理的异常包括请求异常和其他的异常,其中请求异常包括有数据返回的异常和没数据返回的异常,其他异常包括http请求拦截器中代码异常,http响应拦截器中的代码异常,then方法中代码异常等等。

如果你能搞清楚以上的内容,我想你应该知道如何自己封装一个比较全面的request。

感谢您的认真阅读,喜欢就点个再看吧!

### Vue2 中 Axios封装及使用 #### 1. 安装 Axios 在 Vue2 项目中,可以通过 `npm` 或 `yarn` 来安装 Axios。以下是具体的命令: ```bash npm install axios --save ``` 或者 ```bash yarn add axios ``` 完成安装后,在项目的主入口文件 `main.js` 中引入并挂载到 Vue 实例上。 ```javascript import Vue from 'vue'; import axios from 'axios'; // 将 axios 挂载到 Vue 原型链上,方便组件中通过 this.$http 调用 Vue.prototype.$http = axios; ``` 这样就可以在整个应用中的任何地方通过 `this.$http` 使用 Axios 进行网络请求[^1]。 --- #### 2. 创建 Axios 请求封装模块 为了统一管理请求参数、错误处理以及加载状态等功能,通常会单独创建一个用于封装 Axios 的模块。例如,在 `src/utils/http.js` 文件中实现如下功能: ```javascript import axios from 'axios'; const service = axios.create({ baseURL: process.env.BASE_API || '', // 配置基础 URL,默认为空字符串 timeout: 5000, // 设置超时时间 }); // 添加请求拦截器 service.interceptors.request.use( config => { // 可在此处添加 token 到请求头中 const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); // 添加响应拦截器 service.interceptors.response.use( response => response.data, error => { console.error(`Request failed with status code ${error.response.status}`); return Promise.reject(error); } ); export default service; ``` 此部分实现了对 Axios 的基本封装,包括设置默认的基础地址 (`baseURL`) 和超时时间 (`timeout`),并通过拦截器动态修改请求头部信息或捕获异常[^3]。 --- #### 3. 在 Vue 组件中使用封装后的 Axios 假设已经完成了上述封装操作,则可以直接在任意 Vue 组件中导入该工具类,并发起 HTTP 请求。下面是一个简单的 GET 请求示例: ```javascript <template> <div>{{ result }}</div> </template> <script> import http from '@/utils/http'; // 导入封装好的 Axios 工具类 export default { data() { return { result: null, }; }, created() { this.fetchData(); }, methods: { fetchData() { http.get('/api/example') // 发起 GET 请求 .then(response => { this.result = response.message; // 处理返回的数据 }) .catch(error => { console.log('Error:', error); // 错误日志记录 }); }, }, }; </script> ``` 此处展示了如何利用封装过的 Axios 方法执行数据获取逻辑,并将其绑定至模板渲染区域[^1]。 --- #### 4. 全局 Loading 效果集成 为了让用户体验更佳,还可以结合全局 Loading 功能展示正在加载的状态。这一步需要借助 Vuex 存储共享状态或是简单标志位变量来控制显示隐藏行为。具体做法可参见以下代码片段: ```javascript // utils/http.js 修改版 let loadingCount = 0; function showLoading() { if (!loadingCount++) document.body.classList.add('loading'); // 显示遮罩层样式 } function hideLoading() { if (--loadingCount <= 0) document.body.classList.remove('loading'); // 移除遮罩层样式 } service.interceptors.request.use(config => { showLoading(); // 开始请求时触发 return config; }, error => { hideLoading(); // 出现错误也需关闭 return Promise.reject(error); }); service.interceptors.response.use(response => { hideLoading(); // 成功接收回复后再停止动画效果 return response; }, error => { hideLoading(); return Promise.reject(error); }); ``` 与此同时,记得定义 CSS 类名 `.loading` 对应的表现形式以便实际生效[^3]。 --- #### 5. Mock 数据支持(可选) 当开发阶段尚未准备好真实接口环境时,可以考虑采用 mock 技术模拟服务器交互过程。比如基于 `mockjs` 库快速搭建测试场景: ```javascript import Mock from 'mockjs'; Mock.mock(/\/mock\/Prices\/prices\/mgets/, 'get', () => ({ success: true, message: 'This is a mocked API', })); ``` 随后调整之前提到的 api.js 文件里对应路径即可正常调用虚拟资源[^3]。 --- ### 总结 以上就是在 Vue2 项目环境下针对 Axios 插件所做的全面介绍及其典型应用场景分析。希望这些内容能够帮助开发者更加高效便捷地构建现代化前端应用程序!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值