• axios 请求拦截器&响应拦截器


    一、 拦截器介绍

    一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器、响应拦截器。

    1. 请求拦截器
      在请求发送前进行必要操作处理,例如添加统一cookie、请求体加验证、设置请求头等,相当于是对每个接口里相同操作的一个封装;
    2. 响应拦截器
      同理,响应拦截器也是如此功能,只是在请求得到响应之后,对响应体的一些处理,通常是数据统一处理等,也常来判断登录失效等。

    二、 Axios实例

    1. 创建axios实例
    // 引入axios
    import axios from 'axios'
    
    // 创建实例
    let instance = axios.create({
        baseURL: 'xxxxxxxxxx',
        timeout: 15000  // 毫秒
    })
    1. baseURL设置:
    let baseURL;
    if(process.env.NODE_ENV === 'development') {
        baseURL = 'xxx本地环境xxx';
    } else if(process.env.NODE_ENV === 'production') {
        baseURL = 'xxx生产环境xxx';
    }
    
    // 实例
    let instance = axios.create({
        baseURL: baseURL,
        ...
    })
    1. 修改实例配置的三种方式
    // 第一种:局限性比较大
    axios.defaults.timeout = 1000;
    axios.defaults.baseURL = 'xxxxx';
    
    // 第二种:实例配置
    let instance = axios.create({
        baseURL: 'xxxxx',
        timeout: 1000,  // 超时,401
    })
    // 创建完后修改
    instance.defaults.timeout = 3000
    
    // 第三种:发起请求时修改配置、
    instance.get('/xxx',{
        timeout: 5000
    })

    这三种修改配置方法的优先级如下:请求配置 > 实例配置 > 全局配置

    三、 配置拦截器

    // 请求拦截器
    instance.interceptors.request.use(req=>{}, err=>{});
    // 响应拦截器
    instance.interceptors.reponse.use(req=>{}, err=>{});
    1. 请求拦截器
    // use(两个参数)
    axios.interceptors.request.use(req => {
        // 在发送请求前要做的事儿
        ...
        return req
    }, err => {
        // 在请求错误时要做的事儿
        ...
        // 该返回的数据则是axios.catch(err)中接收的数据
        return Promise.reject(err)
    })
    1. 响应拦截器
    // use(两个参数)
    axios.interceptors.reponse.use(res => {
        // 请求成功对响应数据做处理
        ...
        // 该返回的数据则是axios.then(res)中接收的数据
        return res
    }, err => {
        // 在请求错误时要做的事儿
        ...
        // 该返回的数据则是axios.catch(err)中接收的数据
        return Promise.reject(err)
    })
    1. 常见错误码处理(error)
      axios请求错误时,可在catch里进行错误处理。
    axios.get().then().catch(err => {
        // 错误处理
    })

    四、 axios请求拦截器的案例

    // 设置请求拦截器
    axios.interceptors.request.use(
      config => {
        // console.log(config) // 该处可以将config打印出来看一下,该部分将发送给后端(server端)
        config.headers.Authorization = store.state.token
        return config // 对config处理完后返回,下一步将向后端发送请求
      },
      error => { // 当发生错误时,执行该部分代码
        // console.log(error) // 调试用
        return Promise.reject(error)
      }
    )
    
    // 定义响应拦截器 -->token值无效时,清空token,并强制跳转登录页
    axios.interceptors.response.use(function (response) {
      // 响应状态码为 2xx 时触发成功的回调,形参中的 response 是“成功的结果”
      return response
    }, function (error) {
      // console.log(error)
      // 响应状态码不是 2xx 时触发失败的回调,形参中的 error 是“失败的结果”
      if (error.response.status === 401) {
        // 无效的 token
        // 把 Vuex 中的 token 重置为空,并跳转到登录页面
        // 1.清空token
        store.commit('updateToken', '')
        // 2.跳转登录页
        router.push('/login')
      }
      return Promise.reject(error)
    })
    
    

    from:https://juejin.cn/post/7100470316857557006

    
    
  • 相关阅读:
    vue.js 源代码学习笔记 ----- html-parse.js
    vue.js 源代码学习笔记 ----- text-parse.js
    vue.js 源代码学习笔记 ----- keep-alives
    一些图片剪切组件.
    好听的粤语歌..
    jQuery框架Ajax常用选项
    form自动提交
    .NET EF 框架-实现增删改查
    简单抓取小程序大全,并展示
    C#关于调用微信接口的代码
  • 原文地址:https://www.cnblogs.com/youmingkuang/p/16784479.html
Copyright © 2020-2023  润新知