axios的请求拦截与相应拦截

本文介绍了如何使用Axios的请求拦截器来统一处理HTTP请求中的Token携带和全局加载显示。通过在请求拦截器中设置请求头添加Token,并利用响应拦截器处理请求结束时的loading状态,实现了代码的复用和维护性提升。同时,当接收到无效token时,会自动跳转到登录页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

1.请求携带token
2.全局的请求loading

解决:

解决携带token问题 --初次登陆获取token保存在本地

1.每一个需要token的请求都携带token,但是代码重复很多,

request.Gethighquality = (params) => {
    return request.get('/top/playlist/highquality', { params, headers:{Authorization: localStorage.getItem('token') || ''} })
}

2.使用封装的思想,把token封装都请求方式中,这种方式对于携带token来说不麻烦,但是对于请求来说不是利于维护,
参数传递路径,请求方式,参数,…分别在不同的组件,不利于后期的维护
3.想对比来说请求拦截的方式最为便捷, 具体代码看下面的综合案例

import Axios from 'axios'
import { Loading,Message  } from 'element-ui';

const request = Axios.create({
    baseURL: "https://api.mtnhao.com/"
})

//请求拦截
request.interceptors.request.use(requeststart,handleError)

//相应拦截
request.interceptors.response.use(responseend, handleError)

let loading;
//主要是为了把统一时刻的请求合并
let startcount = 0;
let AUTH_TOKEN = localStorage.getItem('token')
//请求拦截
function requeststart(config) {
    // console.log(config);
    //统一添加请求头 ,只要有请求就会携带token
    config.headers = {
        Authorization: AUTH_TOKEN
    }
    //添加统一的loading,Loading.service 会创建一个 loading 实例 ,可通过调用该实例的 close 方法来关闭
   //在第一次请求 和 loading 还没有创建过之前 创建loading
    if (startcount === 0 && !loading) {
        loading = Loading.service({
            target: "body",
            text: '数据加载中',
            background: 'rgba(255,255,255,0.4)',
        });
    }
    startcount++
    return config;
}
//相应拦截
function responseend(response) {
    // console.log(response);
  //只要返回无效token,就跳转到login页面重新登录
    if(response.data.meta.status === 400 && response.data.meta.msg === '无效token'){
        router.push('/login')
    }

    //取消loading,startcount === 0 说明相应全部回来之后再关闭loading
    startcount--;
    if (startcount === 0) {
        loading.close();
        loading = null;
    }
    return response;
}
//错误处理
function handleError(e) {
    Message.error({message:e.message})
    throw e
}

export default request;

请求与相应拦截的数据.png

<think>好的,用户想了解axios请求拦截器。首先,我需要回忆一下axios的基本概念,它是一个基于Promise的HTTP客户端,用于浏览器和Node.js。请求拦截器是axios的一个关键特性,允许在发送请求前对其进行处理。 用户可能的需求是什么?可能是想了解如何使用拦截器,或者为什么需要它们。他们可能遇到了需要在每个请求中添加token,或者统一处理请求配置的问题。需要从基本概念讲起,然后逐步深入。 首先,应该解释请求拦截器的作用,比如修改请求配置、添加头部信息、处理认证等。然后给出一个简单的示例,展示如何添加请求拦截器。可能需要提到axios.interceptors.request.use方法,以及它的两个参数:处理函数和错误处理函数。 需要注意用户是否区分请求和响应拦截器,但用户目前只问了请求拦截器,所以先专注于此。同时,要强调拦截器的执行顺序,如果有多个拦截器,它们会按照添加的顺序执行。这一点可能对用户的实际应用有帮助。 另外,错误处理部分也很重要,如果拦截器中发生错误,该如何处理。可能需要给出一个错误处理的例子,比如返回一个拒绝的Promise,这样可以在catch中捕获。 用户可能的应用场景包括添加认证信息、设置加载状态、统一处理请求参数等。需要举几个实际的例子,让用户明白如何应用到自己的项目中。 还要注意语法正确性,比如在示例中使用正确的ES6语法,箭头函数,模板字符串等。同时,确保代码中的注释清晰,解释每一步的作用。 最后,总结请求拦截器的优势,比如提高代码复用性,集中管理请求逻辑等。这样用户能明白为什么使用它,以及何时使用它。</think>我来为您逐步讲解axios请求拦截器: 1. **基本概念** - 请求拦截器(Request Interceptors)是axios提供的在发起HTTP请求前进行统一处理的机制 - 使用场景:统一添加请求头、处理认证信息、修改请求参数、显示加载状态等 2. **创建方式** ```javascript // 添加请求拦截axios.interceptors.request.use( config => { // 成功处理函数 // 在发送请求前做些什么 return config }, error => { // 错误处理函数 // 对请求错误做些什么 return Promise.reject(error) } ) ``` 3. **典型应用场景** - **案例1:添加认证令牌** ```javascript axios.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }) ``` - **案例2:统一处理请求参数** ```javascript axios.interceptors.request.use(config => { if (config.method === 'post') { config.data = { ...config.data, timestamp: Date.now() } } return config }) ``` 4. **执行顺序** - 按照添加顺序依次执行 - 后添加的拦截器会先执行(类似栈结构) 5. **错误处理** ```javascript axios.interceptors.request.use( config => config, error => { console.error('请求拦截器错误:', error) return Promise.reject(error) } ) ``` 6. **移除拦截器** ```javascript const myInterceptor = axios.interceptors.request.use(config => {/*...*/}) axios.interceptors.request.eject(myInterceptor) // 移除拦截器 ``` **注意事项** 1. 必须返回修改后的`config`对象,否则请求无法发出 2. 异步操作需要使用`async/await`处理 3. 多个拦截器之间应保持独立性和可维护性 4. 避免在拦截器中执行耗时操作,以免影响请求速度 通过请求拦截器,可以实现请求逻辑的集中管理,提升代码复用性,建议将通用处理逻辑封装在拦截器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanny_匚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值