Skip to content

Axios 中的封装

实例创建

js
let service;

export const request = (
  tokenCallback, // token 回调,返回 token 值
  langCallback, // 国际化回调,返回语言类型 (ex: en, zh-cn)
  loginTimeoutCallback, // 登录状态超时后回调
  baseURL // url 公共部分
) => {
  axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
  // 创建 axios 实例
  service = axios.create({
    // axios 中请求配置有 baseURL 选项,表示请求 URL 公共部分
    baseURL: baseURL || "",
    // 超时
    timeout: 10000,
  });

  // 请求拦截
  service.interceptors.request.use(
    (config) => {},
    (error) => {}
  );
  // 响应拦截
  service.interceptors.response.use(
    (response) => {},
    (error) => {}
  );

  return service;
};

request 拦截

js
function tansParams(params) {
  let result = "";
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + "=";
    if (value !== null && value !== "" && typeof value !== "undefined") {
      if (typeof value === "object") {
        for (const key of Object.keys(value)) {
          if (
            value[key] !== null &&
            value[key] !== "" &&
            typeof value[key] !== "undefined"
          ) {
            const params = propName + "[" + key + "]";
            var subPart = encodeURIComponent(params) + "=";
            result += subPart + encodeURIComponent(value[key]) + "&";
          }
        }
      } else {
        result += part + encodeURIComponent(value) + "&";
      }
    }
  }
  return result;
}

service.interceptors.request.use(
  (config) => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false;
    // 接口是否需要携带语言
    const isLang = (config.headers || {}).isLang === false;

    if (tokenCallback() && !isToken) {
      config.headers["Authorization"] = "Bearer " + tokenCallback(); // 让每个请求携带自定义 token 请根据实际情况自行修改
    }

    // get 请求映射 params 参数
    if (config.method === "get" && config.params) {
      let url = config.url + "?" + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
    }

    // 给后端提醒语言国际化
    const lang = langCallback();
    if (lang && !isLang) {
      if (config.url.includes("?")) {
        config.url = config.url + `&local=${lang}`;
      } else {
        config.url = config.url + `?local=${lang}`;
      }
    }

    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

错误封装

js
request.interceptors.response.use(
  (response) => {
    const responseBody = response.data;

    if (responseBody.code === 0) {
      response.data = responseBody.data;
      return response;
    } else {
      // custom error 也可以根据不同的 code 来分流不同的错误
      throw new Error(responseBody.message);
      return Promise.reject(new Error(responseBody.message));
    }
  },
  (error) => {
    // axios error
    return Promise.reject(error);
  }
);
2025( )
今日 33.33%
本周 14.29%
本月 100.00%
本年 49.59%
Powered by Snowinlu | Copyright © 2024- | MIT License