Vue.js axios响应拦截如何获取返回状态码

目录
  • axios响应拦截获取返回状态码方式整理
    • 方法一
    • 方法二
    • 方法三
  • Vue的axios拦截器用法
  • 总结

axios响应拦截获取返回状态码方式整理

方法一

axios.interceptors.response.use(
	response => {
		console.log('拦截器响应成功')
		return response
	},
	error => {
		console.log('拦截器响应失败')
		console.log(error)
		if(error.request){
			console.log(error.request)
		} else if(error.response){
			console.log(error.response.data);
			console.log(error.response.status);
		}
		if (error && error.response) {
			switch (error.response.status) {
				case 400: error.message = '请求错误(400)';
					break;
				case 401: error.message = '未授权,请重新登录(401)';
					break;
				case 403: error.message = '拒绝访问(403)';
					break;
				case 404: error.message = '请求出错(404)';
					break;
				case 408: error.message = '请求超时(408)';
					break;
				case 500: error.message = '服务器错误(500)';
					break;
				case 501: error.message = '服务未实现(501)';
					break;
				case 502: error.message = '网络错误(502)';
					break;
				case 503: error.message = '服务不可用(503)';
					break;
				case 504: error.message = '网络超时(504)';
					break;
				case 505: error.message = 'HTTP版本不受支持(505)';
					break;
				default: error.message = '连接出错'(${error.response.status})!;
			}
		}else{
			error.message ='连接服务器失败!'
		}
		return Promise.reject(error)
	}
)

方法二

// request请求拦截器
axios.interceptors.request.use(
    config => {
        Indicator.open({
            text: '加载中...',
            spinnerType: 'fading-circle'
        });
         //如果cookie中存在Authorization
        if(sessionStorage.getItem('Authorization')){
            config.headers.common['Authorization'] = sessionStorage.getItem('Authorization')
            config.headers.common['loginAuth'] = sessionStorage.getItem('loginAuth')
        }
      return config
    },
    error => {
      Promise.reject(error)
    }
  );
  //response响应拦截器
axios.interceptors.response.use(
    response => {
      if(sessionStorage.getItem('Authorization')){
        // 返回code === 1 || 返回code === 2
        if(response.data.code === 1){
          MessageBox.alert(response.data.msg).then(action=>{})
        }else if(response.data.code === 2){
          MessageBox.alert(response.data.msg).then(action=>{
            sessionStorage.removeItem('Authorization')
            router.push('/login')
          })
        }
      }
        Indicator.close()  //响应成功,关闭全局的Indicator
        return response
    },
    error => {
        Indicator.close()  // 响应错误,关闭全局的Indicator
        if(error){
            const {response} = error
            if(response.status >= 400 && response.status < 500){
                MessageBox.alert('资源不存在,请稍后重试').then(action=>{
                })
            }else if(response.status >= 500){
                MessageBox.alert('服务异常,请稍后重试').then(action=>{
                })
            }
            if(response.data.message === 'Network Error'){
                MessageBox.alert('网络异常,请稍后重试').then(action=>{
                })
            }
        }
      return Promise.reject(error)
    }
);

方法三

// axios请求拦截器
// 每次发送axios请求,都要带上一个token
axios.defaults.timeout = 120000 // 设置默认timeout为2分钟
axios.interceptors.request.use(
  config => {
    config.headers['Content-Type'] = 'application/json; charset=UTF-8'
    config.headers['Cache-Control'] = 'no-catch'
    const token = window.localStorage.getItem('accesstoken')
    if (token) {
      config.headers.common['access-token'] = `${token}`
    }
    return config
  },
  err => {
    console.log(err)
    return Promise.reject(err)
  }
)
axios.interceptors.response.use(
  response => {
    const tokentimer = Number(window.localStorage.getItem('tokentimer'))
    const tokenTimerStamp = Number(response.headers['token-timestamp'])
    /* 时间戳比之前时间戳大的时候替换token */
    if (tokentimer < tokenTimerStamp) {
      window.localStorage.setItem('accesstoken', response.headers['access-token'])
      window.localStorage.setItem('tokentimer', response.headers['token-timestamp'])
    }
    if (response.status === 200) {
      // 导出成功不返回下面的字段
      let _isTrue = response.data.success // 返回成功
      let _message = response.data.message // 返回提示信息
      let codeNum = response.data.code
      let _code, _code3
      if (codeNum) {
        _code = codeNum.toString().slice(0, 1) // 返回失败
        _code3 = codeNum.toString().slice(0, 4)
      } else {
        // 排除导出时成功没有返回code  导致报错
        if (response.data.code) {
          Vue.prototype.$message({
            message: `${codeNum}请求异常,请联系管理员!`,
            type: 'error'
          })
        }
      }
      if (_isTrue && codeNum === 20000) { // 返回成功请求

      } else {
        if (_code === '2' && codeNum !== 20000) {
          Vue.prototype.$message({
            message: `${codeNum}:${_message}`,
            type: 'error'
          })
        } else if (_code === '5' || _code === '6') { // 状态码为5,6开头的为服务器错误
          Vue.prototype.$message({
            dangerouslyUseHTMLString: true,
            message: `${codeNum}:${_message}`,
            type: 'error'
          })
        } else if (_code === '4') { // 状态码为4开头的为权限问题,无法登录
          if (_code3 === '4032') {
            router.push('/login')
          } else {
            Vue.prototype.$message({
              message: `${codeNum}:${_message}`,
              type: 'error'
            })
          }
        }
      }
      return Promise.resolve(response)
    }
    return Promise.reject(response)
  },
  error => {
    if (error.response) {
      Vue.prototype.$message({
        message: '系统异常,请联系管理员!',
        type: 'error'
      })
    } else {
      Vue.prototype.$message({
        message: '网络不给力',
        type: 'error'
      })
    }
    return Promise.reject(error) // 返回接口返回的错误信息
  })

Vue的axios拦截器用法

1.1 介绍:

拦截器包括请求拦截器与相应拦截器,可以在请求发送前或者相应后进行拦截处理。在axios对象上有一个interceptors属性,该属性又有request和response两个属性。axios.interceptors.request和axios.interceptors.response对象提供了use方法,分类设置请求拦截器与响应拦截器。

use()方法支持两个参数,第一个参数是类似于Promise的resolve函数,第二个参数是类似于Promise的reject函数。我们可以在resolve或者reject函数中执行同步或是异步打代码逻辑。

根据官网介绍,其用法如下:

//2.1 请求拦截器
axios.interceptors.request.use(
  function (config) {
    //在请求之前做些什么
    return config
  },
  function (error) {
    //对请求错误做些什么
    return Promise.reject(error)
  }
)
 
//2.2 响应拦截器
axios.interceptors.response.use(
  function (response) {
    //对响应数据做点什么
    return response
  },
  function (error) {
    //对响应错误做点什么
    return Promise.reject(error)
  }
)

1.2 应用场景

比如你在项目中的请求发送是都需要携带token值得,那么我们便可以巧妙的利用axios的请求拦截技术,使得我们只需要在这里拦截,判断是否登录即token值是否存在,存在则放行请求,不存在的话根据项目需求跳转到相应的页面(一般是登录页面)去获取token值再放行登录,举例如下:

1. 在src目录的api目录下创建一个axios.js文件

import axios from 'axios'
import store from '@/store/index' //引入store
import router from '@/router' //引入router
 
//第一步创建实例
//全局axios默认值
//1.可以使用axios.defaulys的方式  2.可以使用axios.create()的方式,以下使用方式2
//方式1
// axios.defaults.baseURL = "http://127.0.0.1:8888/api/private/v1/"
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
//方式2
let instance = axios.create({
  headers: {
    'content-type': 'application/x-www-form-urlencoded'
  }
})
 
//第二步 设置拦截器
//2.1 请求拦截器
instance.interceptors.request.use(
  function (config) {
    let access_token = sessionStorage.getItem('access_token');
    //如果不存在字段,则跳转到登录页面
    if (!access_token) {
      router.push({
        path: '/login',
        query: {
          redirect: router.currentRoute.fullPath
        }
      })
      //终止这个请求
      return Promise.reject();
    } else {
      //token存在,则让每个请求头都加上这个token,后台会判断我这个token是否过期
      config.headers.Authorization = access_token; //token放在请求头那个字段根据后端而定
    }
    //到了这一步就是循序发送请求
    return config;
  },
  function (error) {
    //对请求错误做些什么
    // err为错误对象,但是在我的项目中,除非网络问题才会出现
    Message.error({
      message: '请求超时!'
    })
    return Promise.reject(error);
  })
 
//2.2 响应拦截器
// http response 拦截器
instance.interceptors.response.use(
  response => {
    // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
    // 否则的话抛出错误
    if (response.status === 200) {
      return Promise.resolve(response);
    } else {
      return Promise.reject(response);
    }
  },
  // 服务器状态码不是2开头的的情况
  // 这里可以跟你们的后台开发人员协商好统一的错误状态码
  // 然后根据返回的状态码进行一些操作,例如登录过期提示,错误提示等等
  // 下面列举几个常见的操作,其他需求可自行扩展
  error => {
    if (error.response.status) {
      switch (error.response.status) {
        // 401: 未登录
        // 未登录则跳转登录页面,并携带当前页面的路径
        // 在登录成功后返回当前页面,这一步需要在登录页操作。
        case 401:
          vant.Toast.fail("身份验证失败,请关闭重新进入。");
          break;
 
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          vant.Toast.fail("登录过期,请关闭重新进入。");
          // 清除token
          break;
 
        // 404请求不存在
        case 404:
          vant.Toast.fail("您访问的网页不存在。");
          break;
        // 其他错误,直接抛出错误提示
        default:
          vant.Toast.fail(error.response.data.message);
      }
      return Promise.reject(error.response);
    }
  }
);
//最后将实例导出来
export default instance

2.在main.js中导入并挂载在Vue上

import instance from "./axios-init";//导入
//把axios 作为Vue的原型属性
window.axios = axiosInit();
Vue.prototype.$http = window.axios;//挂载

3.在页面中使用

this.$http.post(url, params).then(res=>{}).catch(error=>{});

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Vue3之列表动画和状态动画示例详解

    目录 概述 示例解析 列表动画 状态动画 总结 概述 列表动画和状态动画都是增加用户体验的方法,当一个列表添加数据或者移除数据时,如果直接添加,突然显示,未免有些突兀,而且用户可能会不知道此时已经有数据加入了,从列表中移除数据也是,用户很有可能不知道当前已经移除了哪一条数据.但是如果加上动画就会好很多了,有趣的动画可以吸引用户的注意力,让用户关注新增和移除的数据.这就是列表动画,而状态动画是指从一个状态到另一个状态的变化,如果直接变过去,就会显得比较生硬,但是如果是加了动画慢慢过渡过去会好很多.

  • Vue项目新一代状态管理工具Pinia的使用教程

    目录 前言 Pinia与Vuex的区别 使用Pinia 直接修改数据的两种方式 使用actions修改数据 重置state中数据 Pinia持久化存储 Pinia模块化实现 Pinia中store之间互相调用 总结 前言 Pinia官网介绍说:Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态.Vuex同样可以作为状态管理工具,那么两者有什么区别呢? Pinia与Vuex的区别 pinia只有store.getter.actions,么有mutations,简化了状态管理的操作 pi

  • vue el-switch初始值(默认值)不能正确显示状态问题及解决

    目录 el-switch 初始值(默认值)不能正确显示状态 使用el-switch显示状态异常 1.问题表述 el-switch 初始值(默认值)不能正确显示状态 先去检查一下接口返回格式 如果是字符串 不需要加冒号 active-value="1" inactive-value="2" 如果是数字 :active-value="1" :inactive-value="2" 使用el-switch显示状态异常 1.问题表述 v

  • vue实现列表滚动的过渡动画

    本文实例为大家分享了Vue实现列表滚动过渡动画的具体代码,供大家参考,具体内容如下 效果图 失帧比较严重,在手机上效果更佳. 原理分析 这个滚动页面由两个部分布局(底部固定的Tab页面除外).一个是顶部的banner轮播,一个是下面的列表.这里的重点是做列表的动画,banner轮播的网上资料很多,请自行查找. 这个动画最重要的是在滚动中实时计算startIndex和endIndex,动画比较简单,就是scale和opacity的变化.向下滚动时,startIndex变小:向上滚动时,endInd

  • vue实现动态列表尾部添加数据执行动画

    目录 动态列表尾部添加数据执行动画 先上动画 动态数据使用wowjs显示动画 1.通过npm安装 2.在main.js中引入animate.css 动态列表尾部添加数据执行动画 先上动画 动态控制节点数量(目前只显示6个节点) 尾部添加几个item,头部则删除几个item 触发 transition-group 动画 splice 的使用方法 代码: <style lang="scss"> .content {   display: flex;   width: 600px

  • vue或css动画实现列表向上无缝滚动

    本文实例为大家分享了vue或css动画实现列表向上无缝滚动的具体代码,供大家参考,具体内容如下 方法一:vue的实现方法 <div id="publishMain" class="b_list">  <div id="publishMain1">    <div class="b_item" v-for="(ac,acindex) in activityList" :key=&

  • vue.js配合$.post从后台获取数据简单demo分享

    首先导入 <script type="text/javascript" src="/island/stage/js/vue.min.js"></script> html样式: <div id="main-content" class="wrap-container zerogrid"> <article id="news_content" v-for="i

  • vue中Axios添加拦截器刷新token的实现方法

    目录 1. Axios基本用法: 2. Axios基本封装用法: 3. 添加拦截器的用法 4. 注意事项: Axios是一款网络前端请求框架,基本用法如下: 1. Axios基本用法: const response = await Axios.create({ baseURL: "https://test.api.com", headers: { 'Content-Type': 'application/json', }, }).post<RequestResponse>(

  • vue.js click点击事件获取当前元素对象的操作

    Vue.js可以传递$event对象 <body id="app"> <ul> <li v-on:click="say('hello!', $event)">点击当前行文本</li> <li>li2</li> <li>li3</li> </ul> <script> new Vue({ el: '#app', data: { message: 'He

  • 如何基于java或js获取URL返回状态码

    这篇文章主要介绍了如何基于java或js获取URL返回状态码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 描述:使用java或者js访问某个网站,返回状态码 1.java实现 // 用getResponseCode可以获取URL返回状态码 String surl = ""; try { surl="你的url"; URL url = new URL(surl); URLConnection rulConnecti

  • vue.js数据响应式原理解析

    目录 Object.defineProperty() 定义 defineReactive 函数 递归侦测对象的全部属性 流程分析 observe 函数 Observer 类 完善 defineReactive 函数 One More Thing Object.defineProperty() 得力于 Object.defineProperty() 的特性,vue 的数据变化有别于 react 和小程序,是非侵入式的.详细介绍可以看 MDN 文档,这里特别说明几点: get / set 属性是函数

  • 前端获取http状态码400的返回值实例

    如下所示: axios.get("/check_mobile_and_sent_code",{withCredentials:true,params:{mobile:formInline.mobile}}).then(res=>{ console.log(res); //if(res.result==true){ if (!this.timer) { this.count = this.TIME_COUNT; this.show = false; this.timer = set

  • RestTemplate设置超时时间及返回状态码非200处理

    目录 1.调试postForEntity请求 2.设置超时时间 默认情况下使用RestTemplate如果返回结果的状态码是200的话就正常处理,否则都会抛出异常: 1.调试postForEntity请求 调试postForEntity请求的方法找到判断响应结果状态码的方法是org.springframework.web.client.DefaultResponseErrorHandler类中的hasError方法 @Override public boolean hasError(Client

  • Django 响应数据response的返回源码详解

    响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由此得到响应数据对象 response. 如今所要做的, 便是将其返回给客户端. 在 Django 源码小剖: 初探 WSGI中, 简要的概括了请求到来时 django 自带服务器的执行关系, 摘抄如下: make_server() 中 WSGIServer 类已经作为服务器类, 负责接收请求, 调用

  • Python中获取网页状态码的两个方法

    第一种是用urllib模块,下面是例示代码: 复制代码 代码如下: import urllib status=urllib.urlopen("http://www.jb51.net").code print status 第二章是用requests模块,下面是例示代码: 复制代码 代码如下: import requests code=requests.get("http://www.jb51.net").status_code print code

  • python获取网页状态码示例

    代码很简单,只需要2行代码就可实现想要的功能,虽然很短,但确实使用,主要使用了requests库. 测试2XX, 3XX, 4XX, 5XX都能准确识别. 复制代码 代码如下: #coding=utf-8 import requests def getStatusCode(url): r = requests.get(url, allow_redirects = False) return r.status_codeprint getStatusCode('http://www.jb51.net

随机推荐