Vue2 项目中通过封装 axios 来同时连接两个不同的后端服务器

你需要在 Vue2 项目中通过封装 axios 来同时连接两个不同的后端服务器,并编写对应的 API 调用模块,提供一套清晰、可维护的实现方案。

完整代码实现

1. 首先安装 axios(如果未安装)
bash 复制代码
npm install axios --save
# 或
yarn add axios
2. 创建 axios 实例配置文件(src/utils/request.js)
javascript 复制代码
import axios from 'axios';
import { Message, MessageBox } from 'element-ui'; // 假设你用了Element UI,可根据UI库调整

// 创建axios实例的通用方法
function createAxiosInstance(baseURL) {
  const service = axios.create({
    baseURL: baseURL, // 不同服务器的基础URL
    timeout: 5000, // 请求超时时间
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    }
  });

  // 请求拦截器
  service.interceptors.request.use(
    (config) => {
      // 可在此处添加token等通用请求头
      const token = localStorage.getItem('token');
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
      return config;
    },
    (error) => {
      console.error('请求错误:', error);
      return Promise.reject(error);
    }
  );

  // 响应拦截器
  service.interceptors.response.use(
    (response) => {
      const res = response.data;
      // 根据后端约定的状态码处理响应
      if (res.code !== 200) { // 假设200为成功状态码
        Message.error(res.message || '请求失败');
        // 401未授权处理
        if (res.code === 401) {
          MessageBox.confirm('登录状态已过期,请重新登录', '提示', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            localStorage.removeItem('token');
            window.location.reload();
          });
        }
        return Promise.reject(new Error(res.message || 'Error'));
      } else {
        return res;
      }
    },
    (error) => {
      console.error('响应错误:', error);
      Message.error(error.message || '服务器错误');
      return Promise.reject(error);
    }
  );

  return service;
}

// 创建两个不同服务器的axios实例
export const request1 = createAxiosInstance('http://server1.example.com/api'); // 第一个服务器地址
export const request2 = createAxiosInstance('http://server2.example.com/api'); // 第二个服务器地址

// 默认导出(可选,用于单服务器场景)
export default request1;
3. 编写 API 调用模块(src/api/)

(1) 第一个服务器的 API(src/api/server1Api.js)

javascript 复制代码
import { request1 } from '@/utils/request';

// 用户相关接口(服务器1)
export const userApi = {
  // 获取用户列表
  getUserList: (params) => {
    return request1.get('/users', { params });
  },
  // 获取用户详情
  getUserDetail: (id) => {
    return request1.get(`/users/${id}`);
  },
  // 创建用户
  createUser: (data) => {
    return request1.post('/users', data);
  }
};

// 产品相关接口(服务器1)
export const productApi = {
  // 获取产品列表
  getProductList: (params) => {
    return request1.get('/products', { params });
  }
};

(2) 第二个服务器的 API(src/api/server2Api.js)

javascript 复制代码
import { request2 } from '@/utils/request';

// 订单相关接口(服务器2)
export const orderApi = {
  // 获取订单列表
  getOrderList: (params) => {
    return request2.get('/orders', { params });
  },
  // 提交订单
  submitOrder: (data) => {
    return request2.post('/orders', data);
  },
  // 取消订单
  cancelOrder: (id) => {
    return request2.put(`/orders/${id}/cancel`);
  }
};

// 支付相关接口(服务器2)
export const paymentApi = {
  // 创建支付单
  createPayment: (data) => {
    return request2.post('/payments', data);
  }
};
4. 在 Vue 组件中使用 API
vue 复制代码
<template>
  <div>
    <el-button @click="getUserData">获取服务器1用户数据</el-button>
    <el-button @click="getOrderData">获取服务器2订单数据</el-button>
  </div>
</template>

<script>
import { userApi } from '@/api/server1Api';
import { orderApi } from '@/api/server2Api';

export default {
  methods: {
    async getUserData() {
      try {
        const res = await userApi.getUserList({ page: 1, size: 10 });
        console.log('服务器1用户数据:', res);
        // 处理数据...
      } catch (error) {
        console.error('获取用户数据失败:', error);
      }
    },
    async getOrderData() {
      try {
        const res = await orderApi.getOrderList({ status: 'pending' });
        console.log('服务器2订单数据:', res);
        // 处理数据...
      } catch (error) {
        console.error('获取订单数据失败:', error);
      }
    }
  }
};
</script>

实现思路解析

1. 多 axios 实例设计
  • 通过createAxiosInstance工厂函数封装通用的 axios 配置(拦截器、超时、请求头),避免重复代码
  • 为每个后端服务器创建独立的 axios 实例(request1/request2),分别配置不同的baseURL
  • 每个实例共享相同的拦截器逻辑,保证请求 / 响应处理的一致性
2. API 模块化管理
  • 服务器 + 业务模块 划分 API 文件(如server1Api.js/server2Api.js),结构清晰
  • 每个业务模块封装为对象(如userApi/orderApi),便于调用和维护
  • API 方法返回 Promise,支持 async/await 语法,代码更简洁
3. 拦截器处理
  • 请求拦截器:统一添加 token、设置通用请求头,减少重复逻辑
  • 响应拦截器:统一处理后端返回的错误码(如 401 登录过期)、错误提示,避免在组件中重复处理错误
4. 环境变量配置(进阶优化)

为了区分开发 / 生产环境的服务器地址,可结合.env文件配置:

javascript 复制代码
// .env.development
VUE_APP_SERVER1_BASE_URL=http://dev-server1.example.com/api
VUE_APP_SERVER2_BASE_URL=http://dev-server2.example.com/api

// .env.production
VUE_APP_SERVER1_BASE_URL=http://prod-server1.example.com/api
VUE_APP_SERVER2_BASE_URL=http://prod-server2.example.com/api

// 在request.js中使用环境变量
export const request1 = createAxiosInstance(process.env.VUE_APP_SERVER1_BASE_URL);
export const request2 = createAxiosInstance(process.env.VUE_APP_SERVER2_BASE_URL);

总结

  • 核心方案 :通过创建多个 axios 实例分别指向不同服务器,配合模块化 API 封装实现双服务器调用
  • 关键设计:使用工厂函数封装通用 axios 配置,保证代码复用;按业务模块组织 API,提高可维护性
  • 最佳实践:结合环境变量管理不同环境的服务器地址,通过拦截器统一处理请求 / 响应逻辑

这种方案不仅支持双服务器,还能轻松扩展到更多服务器,且代码结构清晰、易于维护。

相关推荐
我是小路路呀3 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
程序员爱钓鱼3 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder3 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL4 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码4 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_4 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy4 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌4 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
sg_knight5 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm