vue3中 axios 发送请求 刷新token 封装axios

service.js 页面

javascript 复制代码
import axios from 'axios'
// 创建axios实例
const instance = axios.create({
  baseURL: 'http://gcm-test.jhzhkj.cn:8600/h5card/',
  timeout: 5000, // 请求超时时间
  headers: {
    get: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    post: {
      'Content-Type': 'application/json',
    }
  }
});

 
// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 可以在这里添加请求头等信息
    // config.headers['accesstoken'] = localStorage.getItem('accesstoken');
     const token = localStorage.getItem('accesstoken');
     const userId = 'clientId_pj9A9xEt8Y2YaEyQ9eEx';

     if (token) {
       config.headers.accesstoken = `${token}`;
       config.headers.userId = `${userId}`;
     }
    return config;
  },
  error => {
    // 请求错误处理
    console.log('请求错误处理',error); // for debug
    return Promise.reject(error);
  }
);
 
// 响应拦截器
instance.interceptors.response.use(
  response => {
    //  if ( response.msg == '登录已失效,请退出重新登录!') {
  //  console.log('失败失败',response)
  // }
    const res = response.data;
    // 如果返回的状态码为200,说明成功,可以直接返回数据
    if (res.code === 200) {
      return res;
    } else {
      console.log(res,'响应拦截器 接口返回的错误数据')
      if(res.code == 500){
      alert('请稍后再试')
      }
      // 其他状态码都当作错误处理
      // 可以在这里对不同的错误码进行不同处理
      return Promise.reject({
        message: res.msg || 'Error',
        status: res.code
      });
    }
  },
  async error => {
    // ‌originalRequest._retry‌ 在axios中表示一个布尔值,用于控制请求的重试机制。当_retry设置为true时,表示当前请求将被重试。
    const originalRequest = error.config;
    // token过期 重新刷新Token
    if (error.response.data.code === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      try{
        let paramsData = {
          clientId: "c2YaEyEx", //ID
          clientSecret: "bb92aN9w", //秘钥
        };
        const res = await instance.post('/client/getToken', paramsData);
        const accesstoken = res.data.accesstoken;
        localStorage.setItem('accesstoken', accesstoken);
        instance.defaults.headers.common['accesstoken'] = `${accesstoken}`;
        return instance(originalRequest);

      }catch(refreshError){
        return Promise.reject(refreshError);
      }
    }
    // 对响应错误做处理
    // console.log('对响应错误做处理err' + error); // for debug
    return Promise.reject(error);
  }
);
 
export const httpPost = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    instance({
      url,
      data,
      method: 'post'
    }).then((response) => {
      if (response && response.code === 200) {
        resolve(response)
      } else {
       
        alert(response.msg)
        reject(response && response.msg)
      }
    })
  })
}

export const httpGet = (url, params = {}) => {
  return new Promise((resolve, reject) => {
    instance({
      url,
      params,
      method: 'get'
    }).then((response) => {
      if (response && response.code === 200) {
        resolve(response.data)
      } else {
       
        alert(response.msg)
        reject(response && response.msg)
      }
    })
  })
}

api/common.js页面

javascript 复制代码
import { httpPost,httpGet } from '@/utils/service';
// 获取token
export function getToken(params) {
  return httpPost('/client/getToken',params);
}

vue文件里应用

javascript 复制代码
import { getToken } from "@/api/common";


const getHome = () => {
  let paramsData = {
    clientId: "8Y9eEx",  
  };
  getToken(paramsData).then((res) => {
    if (res.code == 200) {
      if (res && res.data.accesstoken) {
        localStorage.setItem("accesstoken", res.data.accesstoken);
      }
    }
  });
};
相关推荐
Csvn9 分钟前
微前端架构
前端
来让爷抱一个2 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
Linux-lucky2 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
风骏时光牛马4 小时前
生成一个移动端标题,只需要一个标题,不需要其他的任何文本。
前端
IT_陈寒4 小时前
Redis雪崩把我坑惨了,这是5年经验的教训
前端·人工智能·后端
SameX4 小时前
HarmonyOS ArkUI List 的侧滑删除 用 ListItem 的 swipeAction + endIcon 的做法
前端
心祭丫丫4 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪5 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
usdoc文档预览7 小时前
USDOC系列之PPT文件在线编辑-VUE前端实现在线浏览器在线编辑PPT文档
前端·vue.js·编辑器·office365·ppt在线编辑·office文件在线编辑·文件在线编辑
用户2705077725247 小时前
Agent 调工具卡住?3 种超时与取消策略实测对比
前端