Skip to content

axios封装

封装axios库以实现统一处理HTTP请求,通常会创建一个单独的文件来集中管理网络请求相关的配置、拦截器和方法。

安装

sh
npm install axios

基本封装示例

js
// 在src/utils或src/http目录下创建一个名为axios.js(或者request.js)的文件

import axios from 'axios';
import { ref } from 'vue';

// 创建axios实例并设置基础URL和默认配置
const instance = axios.create({
  baseURL: process.env.VUE_APP_API_BASE_URL || 'https://api.example.com', // 设置API的基本URL
  timeout: 5000, // 请求超时时间
});

// 请求拦截器:添加请求头等通用逻辑
instance.interceptors.request.use(
  (config) => {
    // 比如从存储中获取token,并添加到headers
    const token = localStorage.getItem('userToken');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error),
);

// 响应拦截器:处理错误码、统一格式化数据等
instance.interceptors.response.use(
  (response) => {
    // 对响应数据进行预处理
    if (response.data && response.data.code === 200) {
      return response.data.data;
    } else {
      throw new Error(response.data.message || '服务器响应异常');
    }
  },
  (error) => {
    console.error('请求失败:', error);
    // 可以在此处全局处理错误,比如显示提示信息
    ref.error(error.message); // 假设有一个全局错误提示的状态ref
    return Promise.reject(error);
  },
);

// 封装GET请求
export const get = (url, params = {}) => instance.get(url, { params });

// 封装POST请求
export const post = (url, data = {}) => instance.post(url, data);

// 其他HTTP方法也可以按照类似方式封装,例如put、delete等

使用示例

在main.js或应用初始化的地方引入这个封装好的模块

js
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import { get, post } from './utils/axios'; // 引入封装好的axios方法

const app = createApp(App);

app.config.globalProperties.$http = {
  get,
  post,
};

app.use(router).mount('#app');

或者在需要使用的地方,直接调用封装好的方法即可

js
// MyComponent.vue
<script setup>
import { ref } from 'vue';
import { get } from '@/utils/axios';

const users = ref([]);

async function fetchUsers() {
  try {
    const response = await get('/users');
    users.value = response;
  } catch (error) {
    console.error('获取用户列表出错:', error);
  }
}
</script>