zoukankan      html  css  js  c++  java
  • 五、axios拦截器

    一、遇到的问题

     如图

     

     如图

     

     这个值就是拿不到

    代码如下:

    /**
     * Created by superman on 17/2/16.
     * http配置
     */
    import { Toast } from 'vant';
    import axios from 'axios'
    import store from '../vuex/store'
    //import * as types from '../vuex/types'
    //import router from '../router/index'  //
    
    // axios 配置
    // 请求超时时间10秒
    axios.defaults.timeout = 10000
    //axios.defaults.baseURL = 'https://api.github.com'
    // 请求根路径
    axios.defaults.baseURL = 'http://localhost:65194/api'
    
    
    
    // 请求拦截器
    axios.interceptors.request.use(
      config => {
        if (store.state.accessToken) {
          config.headers.Authorization = `Bearer ${store.state.accessToken}`
        }
        return config
      },
      error => {
        return Promise.reject(error)
      },
    )
    
    // 响应拦截器
    axios.interceptors.response.use(
      response => {
        console.warn(response);
        if (response.status === 200) {
          return Promise.resolve(response);
        } else {
          return Promise.reject(response);
        }
      },
      //服务器状态码不是200的情况    
      error => {
        console.warn(error.response);
        // 对响应错误做点什么
        if (error.response) {
          switch (error.response.status) {
            // 401: 未登录                
            // 未登录则跳转登录页面,并携带当前页面的路径                
            // 在登录成功后返回当前页面,这一步需要在登录页操作。
            case 401:
              console.log("未授权");
              /*router.replace({
                path: '/login',
                query: { redirect: router.currentRoute.fullPath }
              });*/
              /*
               Toast({                        
                            message: '登录过期,请重新登录',                        
                            duration: 1000,                        
                            forbidClick: true                    
                        });                    
                        // 清除token                    
                        localStorage.removeItem('token');                    
                        store.commit('loginSuccess', null);                    
                        // 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
                        setTimeout(() => {                        
                            router.replace({                            
                                path: '/login',                            
                                query: { 
                                    redirect: router.currentRoute.fullPath 
                                }                        
                            });                    
                        }, 1000);                 
               */
              break;
            case 403:
              console.log("禁止访问");
              break;
            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.data)
      },
    )
    
    export default axios

    或种写法还是不行

    /**
     * Created by superman on 17/2/16.
     * http配置
     */
    //import {Toast} from 'vant';
    import axios from 'axios'
    import store from '../vuex/store'
    //import * as types from '../vuex/types'
    //import router from '../router/index'  //
    
    // axios 配置
    
    // 创建一个axios实例
    const instance = axios.create({
      baseURL: 'http://localhost:65194/api',// api 的 base_url
      timeout: 10000,     // request timeout  设置请求超时时间
      withCredentials: true, // 是否允许带cookie这些
    })
    
    // 请求拦截器
    instance.interceptors.request.use(config => {
      if (store.state.accessToken) {
        config.headers.Authorization = `Bearer ${store.state.accessToken}`
      }
      return config;
    }, error => {  //请求错误处理
      return Promise.reject(error)
    });
    
    // 响应拦截器
    instance.interceptors.response.use(response => {
      // 接下来会在这里进行token过期的逻辑处理
      console.warn("response heders:",JSON.parse(JSON.stringify(response.headers)));
      return response
    }, error => {
      console.warn("错误响应请求:");
      console.warn(error);
      return Promise.reject(error)
    })
    
    export default instance

    如图:

    二、解决问题

    1、分析

    我用一个简单的axios调用别的接口,可以获取的,排查问题点在接口端,我后台设置了支持跨域呀

     注意后台的跨域,准备应用前端跨域

    2、实现跨域设置 vue cli4.2.2 版本

    2、1创建代理文件

     2、2添加代理配置

    如图所示:

    代码如下:

    module.exports = {
        devServer: {
            //host: "localhost",
            //port: 65194,//端口号  //前端访问的端口号
            https: false,
            open: false,//配置自动启动浏览器
            //proxy:'http://localhost:4000' //配置跨域处理,只有一个代理
            //配置多个代理
            proxy: {
                '/api': {
                    target: 'http://localhost:65194',
                    changeOrigin: true,//是否跨域
                    pathRewrite: {
                        '^/api': '', // 这种接口配置出来实际请求接口 http://localhost:65194/api/login,<br> 
                    }
                }
            }
    
        }
    }

    注意:配置后需要重启服务。

    2、3配置axios的baseUrl

    如图所示:

     代码如下:

    axios.defaults.baseURL = '/api/'  // api 即上面 vue.config.js 中配置的地址

    2、4接口请求

     原理:

            /*
               1、'/api'模糊匹配代理的地址
               2、axios.defaults.baseURL = '/api' 则是匹配到proxy内的'/api'然后替换使用target属性的网址 http://localhost:65194
               因为开启代理是http://localhost:65194,但是在配置$.axios中设置了axios.defaults.baseURL = '/api'
               然后在$.axios请求的 url: "/api/Home/Login"中有api,
               注意:此时请求的网址是http://localhost:65194/api/api/home/login
               所以pathRewrite替换掉一个
            */

    参考:

  • 相关阅读:
    MYbatis调试日记(三)
    Mybatis错误调试(二)
    【转载】MyBatis之传入参数
    Mybatis代码调试问题总结(一)
    【转载】Mybatis多参数查询映射
    未整理的资源
    Strace--系统调用分析问题集锦
    java初始化过程中成员变量
    java三元表达式编程规范问题
    转:Java的一道面试题----静态变量初始化过程
  • 原文地址:https://www.cnblogs.com/fger/p/12303586.html
Copyright © 2011-2022 走看看