axios的封装使用

该文章展示了如何对axios库进行二次封装,通过设置基础URL、超时时间和拦截器,实现请求和响应的处理。特别是,它引入了请求重试机制,当遇到网络问题或请求超时时,能自动进行重试。此外,还定义了通用的createRequest函数,简化了GET、POST、PUT和DELETE等HTTP方法的调用。

axios进行二次封装,实现更强的复用性和扩展性

axios

import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000,
});

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 可以在请求头中添加token等信息
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 可以在这里对响应数据进行处理,例如统一处理错误码等
    return response.data;
  },
  error => {
    // 如果请求超时或者网络错误,可以进行请求重试
    const config = error.config;
    if (!config || !config.retry) return Promise.reject(error);

    config.__retryCount = config.__retryCount || 0;
    if (config.__retryCount >= config.retry) {
      return Promise.reject(error);
    }

    config.__retryCount += 1;

    const backoff = new Promise(resolve => {
      setTimeout(() => {
        resolve();
      }, config.retryDelay || 1);
    });

    return backoff.then(() => {
      return instance(config);
    });
  }
);

// 创建请求函数
const createRequest = (method, url, data = {}, config = {}) => {
  return instance({
    url,
    method,
    data,
    ...config,
  });
};

// 封装get请求
export const get = (url, params = {}, config = {}) => {
  return createRequest('get', url, { params, ...config });
};

// 封装post请求
export const post = (url, data = {}, config = {}) => {
  return createRequest('post', url, data, config);
};

// 封装put请求
export const put = (url, data = {}, config = {}) => {
  return createRequest('put', url, data, config);
};

// 封装delete请求
export const del = (url, params = {}, config = {}) => {
  return createRequest('delete', url, { params, ...config });
};

使用示例

import { createRequest } from './axios';

const request = createRequest('get', '/user', { id: 1 });
request.then(res => {
  console.log(res);
});

在这个示例中,我们抽象出了一个createRequest函数,用于创建请求。我们只需要传入请求方法、请求地址、请求数据和请求配置即可创建一个请求。这样我们就可以通过这个函数来封装任何类型的请求,而不需要每一种请求都写一遍封装代码。

### Vue2 中 Axios封装使用 #### 1. 安装 AxiosVue2 项目中,可以通过 `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 插件所做的全面介绍及其典型应用场景分析。希望这些内容能够帮助开发者更加高效便捷地构建现代化前端应用程序!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值