vue2.0 + axios如何实现两个基础 URL同时存在与使用

76 阅读3分钟

vue2.0 + axios如何实现两个基础 URL同时存在与使用

背景:开发过程中遇到需要接入另外一个服务接口的需求,在只封装axios的基础上实现两个基础 URL同时使用的需求。思路如下:

一、首先,我们需要在utils文件下新建一个baseuel.js的文件作为保存基础url的js模块,代码如下:

//baseuel.js
//导出对应不同接口的URL地址
const configUrl = {
    baseOneUrl: 'https://.......', //模块一地址
    baseTwoUrl: 'https://.......',//模块二地址
};
//导出
export default configUrl

二、然后,我们需要在request.js(即axios封装)中导入它并添加条件判断实现对Axios的包装。代码如下:

//request.js
//首先引入Axios库与刚刚定义的baseurl模块
import axios from "axios";
import baseurl from "./baseurl";
//然后创建一个baseRequest函数充当对Axios的包装。便于统一处理请求。它接受一个"optios"对象,其中包含了有关请求的信息,如HTTP方法、URL、数据和其他选项。
function baseRequest(optios) { 
 //通过三元表达式判断使用不同的基础URL
 let instanceConfig = {
   baseURL:判断条件 ? baseUrl.baseOneUrl : baseUrl.baseTwoUrl,
   timeout: 5000
 };
 //使用axios的create方法中创建一个新到Axios实例“instance”,并将基础URL和其他配置项数据传递进入。
 const instance = axios.create(instanceConfig);
 return instance(optios).then(res => {
   const data = res.data || { }//请求成功返回data,如果没有data返回一个空对象。
   //根据实际需求进行逻辑修改
   if(data.code === 200 && data.data) { 
      return data.data
   }else if(typeof data === "object" && !Array.isArray(data)) { 
      return data
   }else { 
      return Promise.reject( {msg: "返回数据格式错误",res, data} )
   }
   //其他状态码处理
   if(res.code !== 200) {
     return Promise.reject( { msg: "请求失败",res, data } )
   }
 }).catch(err => {
   //请求失败时的处理逻辑
   console.log(err)
   throw err; //继续抛出错误,以便在调用处进行处理
 });
 };
 //最后,我们需要构建一个包含不同HTTP方法的“request”对象,并将它暴露出去。、
 //创建request对象
 const request = ["post", "put", "patch"].reduce((request,method) => {
  /**
  *@param url string 接口地址
  *@param data object 参数
  *@param options object axios配置项
  **/
  request[method] = (url,data = {}, optios = {}) => {
    //调用上面定义的baseRequest函数
    return baseRequest(Object.assign({url, data, methods }, optios));
  };
  return request;
 },{});
 
 ["get", "delete", "head"].forEach(method => {
    /**
  *@param url string 接口地址
  *@param data object 参数
  *@param options object axios配置项
  **/
  request[method] = (url, params = {}, options = {}) => {
    return baseRequest(Object.assign({url, params, method }, options));
  };
 });
 
 //暴露request
 export defalut request;

** 总结:核心思路就是创建一个外部的JS模块用来区分不同的基础URL,并在baseRequest函数中根据具体需求条件判断使用。**

** 这里关于request对象的构建引用了开源项目的代码,拆解关键的地方就是针对"["post", "put", "patch"]"数组中的每个HTTP方法,都会通过reduce数组方法遍历一次,在每次循环中会定义一个新的方法添加到request对象中,这个方法接受url、data、以及options作为参数,并在方法内部调用baseRequest函数,baseRuquest函数负责发起实际额请求,并使用Object.assign方法将传递的参数合并(url,data,method以及可能存在的potiobs),另外一组类似。
** 总之,这里是为了方便发起不同类型的请求,达到不用每次都手动调用“baseRequest"函数的目的。****