简单的axios二次封装

611 阅读2分钟

axios的二次封装

1.1创建一个serverConfig.js文字,作为axios二次封装的配置文件
 let baseURL = ""
 switch (process.env.NODE_ENV) {
    //可以在根目录的 package.json 配置 NODE_ENV 
    case 'production':
        baseURL = "生产环境地址"
         break;
    case 'test':
         baseURL = "测试环境地址"
    default:
        baseURL = "开发环境地址";
 }
const serverConfig = {
    baseURL:"baseURL", // 请求基础地址,可根据环境自定义
    useTokenAuthorization: true, // 是否开启 token 认证
    
};
export default serverConfig;

axios更多配置选项可以参考官方文档:www.axios-js.com/zh-cn/docs/…

1.2创建axios实例,并引入相关文件,后续需要
//index.jsimport axios from "axios";
import serverConfig from "./config/serverConfig"; //引入配置项文件
import qs from "qs";//可以对post请求传参进行序列化处理// 创建 axios 请求实例
const serviceAxios = axios.create({
    baseURL: serverConfig.baseURL, // 基础请求地址
    timeout: 10000, // 请求超时设置
    withCredentials: false, // 跨域请求是否需要携带 cookie
});
1.3设置请求拦截
//index.js// 创建请求拦截
serviceAxios.interceptors.request.use(
    (config) => {
        // 如果开启 token 认证
        if (serverConfig.useTokenAuthorization) {
            config.headers["Authorization"] = localStorage.getItem("token"); // 请求头携带 token
        }
        // 设置请求头
        if (!config.headers["content-type"]) { // 如果没有设置请求头
            if (config.method === 'post') { 
                config.headers["content-type"] = "application/x-www-form-urlencoded"; // post 请求
                config.data = qs.stringify(config.data); // 序列化,比如表单数据
                console.log(config.data);
            } else {
                config.headers["content-type"] = "application/json"; // 默认类型
            }
        }
        console.log("请求配置", config);
        return config;
    },
    (error) => {
        Promise.reject(error);
    }
);
​

这里补充说明一下:

POST请求参数序列化

在POST请求中的 Content-Type 常见的有以下3种形式:

  • Content-Type: application/json
  • Content-Type: application/x-www-form-urlencoded
  • Content-Type: multipart/form-data

现在主流基本在用application/json形式,Axios默认以这种形式工作,我们给后端接口传递参数也简单,直接丢在其data参数就行了。

但是有时候后端要求Content-Type必须以application/x-www-form-urlencoded形式,那么通过上面传递的参数,后端是收不到的,我们必须对参数数据进行所谓的序列化处理才行,让它以普通表单形式(键值对)发送到后端,而不是json形式

1.4.设置响应拦截
//index.js
//响应失败时返回的参数处理
const messageMap = {
    302:"接口重定向了!",
    400:"请求参数错误!",
    401: "您未登录,或者登录已经超时,请先登录!",
    403:"您没有权限访问该资源!",
    404:"您访问的资源不存在!",
    500:"服务器内部错误!",
    502:"网关错误!",
    504:"网关超时!",
    default: "异常问题,请联系管理员!"
}
// 创建响应拦截
serviceAxios.interceptors.response.use(
    //响应成功
    (res) => {
            let data = res.data;
            // 处理自己的业务逻辑,比如判断 token 是否过期等等
            return data;
        
    },
    //响应失败
    (error) => {
        if (error && error.response) {
          //使用key:value的形式
          return messageMap[error.response.status] || "default" 
        } 
          //服务器连结果都没有返回
        if (!window.navigator.onLine) {
                //断网处理:跳转断网页面/提示网络错误等等
                return;
            }
    }
);
1.5接口调用示例
import serviceAxios from "../index"; //引入上面的index.js文件//get请求
export const getTest = (params) => {
    return serviceAxios({
        url: "/test",
        method: "get",
        params,
    });
};
//post请求
export const postTest1 = (data) => {
    return serviceAxios({
        url: "/test1",
        method: "post",
        data
    });
};
//其他请求方法

这里借鉴了两位前辈的文章,写的都很好!

zhuanlan.zhihu.com/p/509680724

juejin.cn/post/696863…

最后附上github地址github.com/mengliren66…