配置axios全局拦截器

拦截器的作用

在每次请求后台的时候携带token等参数。
在响应时检查token是否需要移除、更新和统一响应等。

配置步骤

创建http.js

全局参数配置

// 引入axios
import axios from 'axios'; 

//设置请求超时
axios.defaults.timeout = 10000;
axios.defaults.withCredentials = true

//请求头设置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

请求拦截器

// 请求拦截器
axios.interceptors.request.use(    
    config => {        
        // 从本地存储中获取token,携带在header中
        const token = localStorage.token;
        const openId = localStorage.id    
        token && (config.headers.Authorization = 'Bearer' +' ' + token);    
        openId && (config.headers.openId = openId); 
        return config;    
    },    
    error => {        
        return Promise.error(error);    
    }
)

响应拦截器

// 响应拦截器
axios.interceptors.response.use(    
    response => {   

        // 统一定义状态码为200时,表示请求成功,其他请求失败
        if (response.status === 200) {            
            return Promise.resolve(response);        
        } else {            
            return Promise.reject(response);        
        }    
    },    

    // 可根据错误响应码判断状态,做出相应的处理
    error => {            
        if (error.response.code) {            
            switch (error.response.code) {                
                // 401: 未登录
                // 未登录时跳转登录界面,登录成功后回调登录前被拦截的地址 query.redirect
                case 401:                    
                    router.replace({                        
                        path: '/toLogin',                        
                        query: { 
                            redirect: router.currentRoute.fullPath 
                        }
                    });
                    break;

                // 403 token过期
                // 清空本地存储的token,跳转登录界面
                case 403:
                     Toast({
                        message: '登录过期,请重新登录',
                        duration: 1000,
                        forbidClick: true
                    });
                    // 清除token
                    localStorage.removeItem('token');
                    store.commit('loginSuccess', null);
                    // 登录成功后回调登录前被拦截的地址 query.redirect
                    setTimeout(() => {                        
                        router.replace({                            
                            path: '/login',                            
                            query: { 
                                redirect: router.currentRoute.fullPath 
                            }                        
                        });                    
                    }, 1000);                    
                    break; 

                // 404请求不存在
                case 404:
                    Toast({
                        message: '网络请求不存在',
                        duration: 1500,
                        forbidClick: true
                    });
                    break;
                // 其他错误,弹出对应的响应信息
                default:
                    Toast({
                        message: error.response.data.message,
                        duration: 1500,
                        forbidClick: true
                    });
            }
            return Promise.reject(error.response);
        }
    }    
);

对get、post、及表单提交的请求封装

get 请求

export function get(url, params){    
   return new Promise((resolve, reject) =>{        
       axios.get(url, {            
           params: params        
       }).then(res => {
           resolve(res.data);
       }).catch(err =>{
           reject(err.data)        
   })    
});}

post 请求

export function post(url, params) {
    return new Promise((resolve, reject) => {
         axios.post(url, QS.stringify(params))
        .then(res => {
            resolve(res.data);
        })
        .catch(err =>{
            reject(err.data)
        })
    });
}

post from 请求

export function postForm(url, params) {
    return new Promise((resolve, reject) => {
         axios.post(url, (params))
        .then(res => {
            resolve(res.data);
        })
        .catch(err =>{
            reject(err.data)
        })
    });
}

项目使用

创建一个api.js,对请求方法做进一步封装

import { get, post, postForm } from './http'

export const login = p => post('user/login', p);

export const deleteUser = p => postForm('user/delete', p);

实际方法调用

import {login} from '../request/api'
login({'username':this.ruleForm.name,'password':this.ruleForm.paw}).then(res=>{
              console.log(res)
              if (res.code == 0) {
                // 根据token获取用户信息
              } else {
                this.message = res.data
              }
            })
            .catch({

            })
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
axios请求拦截器在发送请求之前会拦截请求,并可以对请求进行一些处理。在这个例子中,我们可以看到拦截器配置在引用中的`http.interceptors.request.use`函数中完成。该函数接受一个参数`config`,代表当前要发送的请求的配置。在这个函数中,我们可以根据需要对请求进行一些逻辑判断。 首先,我们可以看到在这个拦截器中定义了一个数组`noLanJie`,它包含了一些不需要被拦截的请求地址。如果请求的地址在这个数组中存在,那么就直接放行,不做任何处理。 如果请求的地址不在`noLanJie`数组中,那么就是需要被拦截的请求。在这个例子中,拦截器会从本地存储中获取到一个名为`token`的值,并将它添加到请求的请求头中的`authorization`字段中。这样,在发送请求时,会将这个`token`作为身份验证信息携带到后端。最后,拦截器需要返回`config`对象,以便让请求继续发送。 总结起来,axios的请求拦截器可以在发送请求之前对请求进行一些处理,例如添加请求头信息等。拦截器可以根据请求的配置进行逻辑判断,决定是否拦截请求并进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [axios请求拦截器配置](https://blog.csdn.net/qq_44603011/article/details/123121764)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue axios登录请求拦截器](https://download.csdn.net/download/weixin_38655810/13194829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [axios全局拦截+请求响应处理+路由拦截](https://blog.csdn.net/weixin_42484657/article/details/122365109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陆小叁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值