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);
      }
    }
  });
};
相关推荐
无限大.1 小时前
前端知识速记:节流与防抖
前端
十八朵郁金香1 小时前
【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能
前端·javascript·vue.js
学问小小谢1 小时前
第26节课:内容安全策略(CSP)—构建安全网页的防御盾
运维·服务器·前端·网络·学习·安全
LCG元2 小时前
Vue.js组件开发-实现全屏图片文字缩放切换特效
前端·javascript·vue.js
xrgs_shz2 小时前
MATLAB的数据类型和各类数据类型转化示例
开发语言·数据结构·matlab
还是鼠鼠3 小时前
图书管理系统 Axios 源码__新增图书
前端·javascript·vscode·ajax·前端框架·node.js·bootstrap
来恩10035 小时前
C# 类与对象详解
开发语言·c#
komo莫莫da5 小时前
寒假刷题Day19
java·开发语言
ElseWhereR6 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法