• axios 封装


    import axios from "axios";
    import store from "@/store";
    import router from "@/router";
    
    const service = axios.create();
    //request拦截
    service.interceptors.request.use(
      request => {
        let { current } = router.history;
        if (
          store.getters["userStore/getParamToken"] &&
          current.name !== "Login" &&
          request.url != "刷新接口URL"
        ) {
          //非登陆界面并且不是调用刷新接口并且本地要有token才可以加autho验证
          request.headers.Authorization = `Bearer ${
            store.getters["userStore/getParamToken"]
          }`;
        }
        return request;
      },
      error => {
        console.error(error);
        return error;
      }
    );
    
    //response拦截
    service.interceptors.response.use(
      response => {
        return response;
      },
      async error => {
        try {
          if (error && error.response) {
            switch (error.response.status) {
              case 401:
                // 返回 401 清除token信息并跳转到登录页面
                let refreshToken = store.getters["userStore/getParamRefreshToken"];
                let { data } = await post(
                  刷新的接口和参数
                );
                if (data.code === 200) {
                  //刷新token成功后,获取新的token,覆盖旧的token,然后返回到报错的页面刷新掉
                  store.commit("userStore/setParamToken", data.result.access_token);
                  var backoff = new Promise(resolve => {
                    resolve();
                  });
                  return backoff.then(r => {
                    return service(error.config);
                  });
                } else {
                  let { current } = router.history;
                  // current.meta.keepAlive = false;
                  if (current.fullPath !== "/login") {
                    store.commit("userStore/setBackUrl", current.fullPath);
                  }
                  //refreshtoken失效的话,就直接到登陆页面
                  router.push("/login");
                }
    
                return error;
              default:
                console.error(error);
                return error;
            }
          } else {
            console.error(error);
            return error;
          }
        } catch (error) {
          console.error(error);
        }
      }
    );
    
    export async function get(
      url,
      params,
      contentType = "application/json;charset=UTF-8"
    ) {
      service.defaults.headers.post["Content-Type"] = contentType;
      return await service.get(url, params);
    }
    
    export async function post(
      url,
      params = null,
      contentType = "application/json;charset=UTF-8",
      onUploadProgress=()=>{}
    ) {
      service.defaults.headers.post["Content-Type"] = contentType;
      return await service.post(url, params,{
        onUploadProgress:onUploadProgress
      });
    }
    
    export async function put(
      url,
      params = null,
      contentType = "application/json;charset=UTF-8"
    ) {
      service.defaults.headers.post["Content-Type"] = contentType;
      return await service.put(url, params);
    }
    
    export async function remove(
      url,
      params = null,
      contentType = "application/json;charset=UTF-8"
    ) {
      service.defaults.headers.post["Content-Type"] = contentType;
      return await service.delete(url, { data: params });
    }
    

      

  • 相关阅读:
    [AH2017/HNOI2017]礼物
    [八省联考2018]林克卡特树lct
    [洛谷P4847]银河英雄传说V2
    [洛谷P4999]烦人的数学作业
    [洛谷P4171][JSOI2010]满汉全席
    [CF785E]Anton and Permutation
    [洛谷P2511][HAOI2008]木棍分割
    [洛谷P4430]小猴打架
    [UVA307]小木棍 Sticks
    [LOJ #6433]「PKUSC2018」最大前缀和
  • 原文地址:https://www.cnblogs.com/llcdbk/p/13100737.html
Copyright © 2020-2023  润新知