自己的axios配置

大约 3 分钟

自己的axios配置

axios封装

根据public文件夹的config.json获取api地址

// config.json
{
  "url": "http://localhost:2801",
  "uploadUrl": "http://localhost:2801"
}


js写法

// http.ts
import { useUserStore } from "@/store/user";
import qs from "qs";
import axios, { AxiosRequestConfig } from "axios";
import { Result } from "@/interface/result";

export const baseConfig = (await axios.get("/config.json")).data;
const instance = axios.create({
  baseURL: baseConfig.url  ,
  timeout: 6000
});

instance.defaults.withCredentials = true;
instance.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    console.log("requestUrl==", config.url);

    // if (process.client) {
    config.headers["version"] = "1.0";
    config.headers["Content-Type"] = "application/json;charset=UTF-8";
    let userStore = useUserStore();
    if (userStore.token) {
      config.headers.token = userStore.token;
    }

    console.log(config);
    // }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
// 添加响应拦截器

instance.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    console.log("进入response");
    let data: Result = response.data;
    return data;
  },
  function(error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);
// @ts-ignore
instance.postForm = (url: string, data: any) => {
  return instance.post(url, qs.stringify(data), {
    headers: { "content-type": "application/x-www-form-urlencoded" }
  });
};
export default instance;

根据域名获取api地址

import { getApiUrl } from '@/plugins/utils'

import axios from 'axios'
axios.interceptors.request.use((config) => {
  console.log('requestUrl==',config.url)
  console.log('requestData==', config.data)
  return config
},(error) => {
  return Promise.reject(error)
})
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  console.log('responseData==',response.data)
  return response;
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error);
});
axios.defaults.baseURL=getApiUrl()
export default axios

根据ip地址获取相应的api

export const getApiUrl = (str:string) => {
    const devArr = ["dev.yzqdev.top", "localhost"];
    const apiArr = ["www.yzqdev.top"];
    let localUrl = "192.168.";
    let isDev =
        devArr.includes(document.domain) || document.domain.includes(localUrl);
    let isProd = apiArr.includes(document.domain);
    // 需要后端接   线上环境的域名组

    if (str === "socket") {
        if (isDev) {
            return "wss://dev.yzqdev.top";
        }

        if (isProd) {
            return "wss://www.yzqdev.top";
        }
    }

    if (isDev) {
        return "https://yzqdev.top";
    }

    if (isProd) {
        return "https://www.yzqdev.top";
    }
};

export const getDomainApi=(port:string,url=document.domain, ) => {
  return `http://${url}:${port}`
}

下面是项目的axios

/**axios封装
 * 请求拦截、相应拦截、错误统一处理
 */
import axios from "axios";
import QS from "qs";
import { Toast } from "vant";
import store from "../store/index";
import {getApiUrl} from "@/utils/getApiUrl";
// 环境的切换
axios.defaults.baseURL=getApiUrl()
// 请求超时时间
axios.defaults.timeout = 10000;
// post请求头
axios.defaults.headers.post["Content-Type"] =
  "application/x-www-form-urlencoded;charset=UTF-8";
// 请求拦截器
axios.interceptors.request.use(
  (config) => {
    // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
    const token = store.state.token;
    token && (config.headers.Authorization = token);
    return config;
  },
  (error) => {
    return Promise.error(error);
  }
);
// 响应拦截器
axios.interceptors.response.use(
  (response) => {
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是200的情况
  (error) => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面,并携带当前页面的路径
        // 在登录成功后返回当前页面,这一步需要在登录页操作。
        case 401:
          router.replace({
            path: "/login",
            query: { redirect: router.currentRoute.fullPath },
          });
          break;
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          Toast({
            message: "登录过期,请重新登录",
            duration: 1000,
            forbidClick: true,
          });
          // 清除token
          localStorage.removeItem("token");
          store.commit("loginSuccess", null);
          // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.replace({
              path: "/login",
              query: {
                redirect: router.currentRoute.fullPath,
              },
            });
          }, 1000);
          break;
        // 404请求不存在
        case 404:
          Toast({
            message: "网络请求不存在",
            duration: 1500,
            forbidClick: true,
          });
          break;
        // 其他错误,直接抛出错误提示
        default:
          Toast({
            message: error.response.data.message,
            duration: 1500,
            forbidClick: true,
          });
      }
      return Promise.reject(error.response);
    }
  }
);
/**
 * get方法,对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function get(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params,
      })
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err.data);
      });
  });
}
/**
 * post方法,对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export function post(url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, QS.stringify(params))
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err.data);
      });
  });
}