axios拦截器

这篇具有很好参考价值的文章主要介绍了axios拦截器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一般在项目中,发送http请求时会对请求和响应进行一些特定的处理:判断token,设置请求头等,如果要挨个对每个请求都做处理的话太麻烦,方便起见,axios提供了拦截器。

axios拦截器分为请求拦截器和响应拦截器:

  • 请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
  • 响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });
  • 也可以移除拦截器
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
  • 可以自定义axios实例,然后添加拦截器(一般在项目中都要自己去new一个axios实例,然后添加对应的拦截器)
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

举例说明文章来源地址https://www.toymoban.com/news/detail-513628.html

  • 请求头中添加token
import storage from '@maple/maple-framework/composable/storage';
import { ACCESS_TOKEN } from '../../../store/mutation-types';

export function requestHttp(http, errorHandler) {
   http.interceptors.request.use(config => {
      const token = storage.get(ACCESS_TOKEN);

      // 如果 token 存在
      // 让每个请求携带自定义 token 请根据实际情况自行修改
      if(token) {
         config.headers.authorization = token;
      }

      return config;
   }, errorHandler);    // 这里的errorHandler是统一做的error处理
}
  • 统一处理http响应数据(可以在这里设置登录失效时间)
import { Notification } from 'element-ui';
import storage from '@maple/maple-framework/composable/storage';
import { ACCESS_TOKEN } from '../../../store/mutation-types';
import store from '../../../store/index';

export function responseHttp(http, errorHandler) {
   http.interceptors.response.use((response) => {
      // 登录失效时间
      const expiration = new Date().getTime() + (store.getters.logoutTimeout ? store.getters.logoutTimeout * 60 * 1000 : 30 * 60 * 1000);

      if(response.headers.authorization) {
         storage.set(ACCESS_TOKEN, response.headers.authorization, expiration);
      }
      else if(storage.get(ACCESS_TOKEN)) {
         storage.set(ACCESS_TOKEN, storage.get(ACCESS_TOKEN), expiration);
      }

      if(response.config.response) {
         return response;
      }

      if(response.config.feedback === true) {
         Notification.success({
            title: '操作提示',
            message: '操作成功',
         });
      }

      if(response.headers['x-response-formatted'] === 'TRUE') {
         return response.data.data;
      }

      return response.data;
   }, errorHandler);        // 这里的errorHandler是统一做的error处理
}
  • errorHandler
const errorHandler = (error) => {
   if(error.config.response) {
      return Promise.reject(error);
   }

   if(error.response) {
      const data = error.response.data;

      // 从 localstorage 获取 token
      const token = storage.get(ACCESS_TOKEN);

      if(error.response.status === 400) {
         Notification.warning({
            title: '警告',
            message: data.message,
         });
      }

      if(error.response.status === 403) {
         Notification.error({
            title: 'Forbidden',
            message: data.message,
         });
      }

      if(error.response.status === 401 && !error.response.config.url.endsWith('/auth/login')) {
         Notification.error({
            message: '登录已过期,请重新登录',
         });

         if(token) {
            // store.dispatch('resetToken');
            storage.remove(ACCESS_TOKEN);
            router.replace(`${loginRoutePath}?${router.currentRoute.path}`);
            // onClose();
         }
      }

      if(error.response.status === 500) {
         if(data.type === 'application/json') {
            const fileReader = new FileReader();

            fileReader.readAsText(data);

            fileReader.onloadend = () => {
               const jsonData = JSON.parse(fileReader.result);
               Notification.error({
                  message: jsonData.message || '请检查网络连接',
               });
            };
         }
         else {
            Notification.error({
               message: data.message || '请检查网络连接',
            });
         }
      }
   }
   else {
      Notification.error({
         message: '请检查网络连接',
      });
   }

   return Promise.reject(error);
};

到了这里,关于axios拦截器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • axios拦截器,如何批量处理请求响应

    从浏览器创建 XMLHttpRequests 从 node.js 创建 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 取消请求 自动转换JSON数据 客户端支持防御XSRF 在请求或响应被 then 或 catch 处理前拦截它们。 新建request.js,写入以下内容: 在需要使用的页面进行调用 上一步咱们将axios拦

    2024年02月13日
    浏览(42)
  • axios拦截器:每次请求自动带上 token

    Step 1:创建Axios实例并添加拦截器 在你的Vue项目中,一般我们会先导入axios,然后创建一个axios实例。这样做是为了方便统一管理和配置。 上面的代码做了什么呢? 1. 我们创建了一个axios实例service,相当于有了一个专属邮差。 2. 给这个邮差设置了规则:每次出门送信前,先检

    2024年04月09日
    浏览(55)
  • Vue3 网络请求——axios 高级用法之 axios 拦截器实战与并发请求

    Axios 是一个流行的基于 Promise 的 HTTP 客户端库,用于在浏览器和 Node.js 中发出 HTTP 请求。 Axios 还支持请求和响应的拦截器。接下来通过这篇文章,我们一起来学习和了解一下 Axios 拦截器和并发请求,通过实际代码来介绍如何使用 Axios 拦截器。 拦截器会在发生响应请求之前和

    2024年02月10日
    浏览(45)
  • Vue 网络处理 - axios 异步请求的使用,请求响应拦截器(最佳实践)

    目录 一、axiox 1.1、axios 简介 1.2、axios 基本使用 1.2.1、下载核心 js 文件. 1.2.2、发送 GET 异步请求 1.2.3、发送 POST 异步请求 1.2.4、发送 GET、POST 请求最佳实践 1.3、请求响应拦截器 1.3.1、拦截器解释 1.3.2、请求拦截器的使用 1.3.3、响应拦截器的使用 1.3.4、拦截器在 Vue 脚手架中的

    2024年02月04日
    浏览(46)
  • vue+axios——创建多个实例共用请求拦截器和响应拦截器(403错误信息不提示bug解决)——基础积累

    创建多个实例共用请求拦截器和响应拦截器:使用的是函数的继承,也就是 call() 方法,这个方法第一个参数就是 this ,后面的参数可以是一个也可以是多个。最后一定要记得要 return 出去,否则接口是拿不到数据的。 上面两个文件合并后的处理如下: 在 main.js 中添加如下内容

    2024年02月10日
    浏览(50)
  • axios拦截器

    一般在项目中,发送http请求时会对请求和响应进行一些特定的处理:判断token,设置请求头等,如果要挨个对每个请求都做处理的话太麻烦,方便起见,axios提供了拦截器。 axios拦截器分为请求拦截器和响应拦截器: 请求拦截器 响应拦截器 也可以移除拦截器 可以自定义axi

    2024年02月11日
    浏览(43)
  • Vue axios 拦截器

    正常情况下打开浏览器前端页面向后端发起请求使用的是axios,无论是原生的axios还是自己封装的axios都看成是axios。发起请求之后后端去数据库里面拿数据,然后返回给前端。 发起请求的地方是axios,并且你能够封装这个axios,那么你就可以添加拦截器。 请求拦截器就是你在

    2024年02月04日
    浏览(41)
  • axios不经过全局拦截器策略

    项目中使用的axios请求通常会根据项目情况进行请求拦截request和响应拦截response设置,比如对响应拦截的值具体值返回给调用请求部分直接使用 如果一个请求接口不需要使用这个拦截器,axios没有跳过拦截器等的设置,此时只需要创建一个新的axios实例进行使用即可 使用原始

    2024年02月01日
    浏览(43)
  • vue写一个axios的拦截器

    要编写并生效Axios拦截器,可以按照以下步骤进行操作: 1.创建一个文件:在你的项目中,创建一个新的JavaScript文件,例如interceptors.js,用于编写拦截器代码。 2.导入所需的库和模块:在interceptors.js文件中,导入所需的Axios库和其他依赖项。 // 其他依赖项的导入 3.创建Axios实

    2024年02月12日
    浏览(62)
  • 以配置的方式开关axios拦截器功能

    前景提要: ts 简易封装 axios,统一 API axios 很多额外功能都是基于拦截器实现。有些功能想要全局使用,因此将拦截器注册在全局。比如重复请求过滤。但也有一小部分请求不希望进行过滤,比如并发上传文件。 因此希望可以在具体的请求方法上,通过配置 config 从而决定针

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包