首页前端开发VUEVue.js axios响应拦截如何获取返回状态码

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

时间2024-02-11 05:00:03发布访客分类VUE浏览287
导读:收集整理的这篇文章主要介绍了Vue.js axios响应拦截如何获取返回状态码,觉得挺不错的,现在分享给大家,也给大家做个参考。 目录axios响应拦截获取返回状态码方式整理方法一方法二...
收集整理的这篇文章主要介绍了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请求,都要带上一个tokenaxios.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' //引入storeimport 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';
      //方式2let 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=>
      {
      }
          );
          

      总结

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

      您可能感兴趣的文章:
      • Vue中的计算属性和axios基本使用回顾
      • vue axios接口请求封装方式
      • Vue如何处理Axios多次请求数据显示问题
      • Vue3全局配置axios的两种方式总结
      • 浅谈Vue知识系列-axios
      • Vue封装axios的示例讲解
      • Vue Axios异步与数据类型转换问题浅析

      声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


      若转载请注明出处: Vue.js axios响应拦截如何获取返回状态码
      本文地址: https://pptw.com/jishu/609351.html
      Vue数据监听器watch和watchEffect的使用 vue2.0的计算属性computed和watch的区别及各自使用场景解读

      游客 回复需填写必要信息