当前位置: 代码网 > it编程>前端脚本>Vue.js > Vue.js axios响应拦截如何获取返回状态码

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

2024年05月19日 Vue.js 我要评论
axios响应拦截获取返回状态码方式整理方法一axios.interceptors.response.use(response => {console.log('拦截器响应成功')return

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)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com