zoukankan      html  css  js  c++  java
  • 配置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({
    
                })
    
    充满鲜花的世界到底在哪里
  • 相关阅读:
    【转】PLSQL developer 连接不上64位Oracle 的解决方法
    Cadence 错误合集
    二十三、原理图和PCB交互式布局
    二十二、导入DXF文件
    二十一、打开和关闭飞线
    电源设计基础(罗伯特.A.曼马诺) TI电源书籍
    ORA-01033: ORACLE initialization or shutdown in progress 实用的处理方法
    转载“启动关闭Oracle数据库的多种方法”--来自百度#Oracle
    vue+django+mysql前后端分离的课程管理系统
    webshell扫描器
  • 原文地址:https://www.cnblogs.com/aliases/p/14693282.html
Copyright © 2011-2022 走看看