Vue 2.0封装axios笔记

作者: 回调的幸福时光 | 来源:发表于2017-05-19 15:17 被阅读25585次

    前言


    单页面应用大多采用前后端分离开发思路,我们知道,前端和后端交互有多中方式(服务器端渲染、Ajax、websocket等),今天我们主要讲解Ajax部分。

    最近团队讨论了一下,Ajax 本身跟 Vue 并没有什么需要特别整合的地方,使用 fetch polyfill 或是 axios、superagent 等等都可以起到同等的效果,vue-resource 提供的价值和其维护成本相比并不划算,所以决定在不久以后取消对 vue-resource 的官方推荐。已有的用户可以继续使用,但以后不再把 vue-resource 作为官方的 ajax 方案。
    -- 摘自vuefe.github.io

    vue更新至2.0之后,官方推荐的Ajax插件库是axios,而不再是vue-resource,理由如上。

    axios快速使用


    如何安装请移步axios,文档描述的很清楚。

    常见用法

    其实我们用的最多的就是get、post请求。

    Performing a GET request

    // get
    axios.get('/user', {
        params: {
          ID: 12345
        }
      })
      .then(function (response) {
        console.log(response);
      })
      .catch(function (error) {
        console.log(error);
      });
    

    Performing a POST request

    axios.post('/user' , {
      params: {
        firstName: 'Fred',
        lastName: 'Flintstone'
      }
    })
      .then(function (response) {
        console.log(response);
      })
      .catch(function (error) {
        console.log(error);
      });
    

    掌握了以上两种最基本的用法,我们已经可以去进行开发了。

    示例demo

    演示了如何使用axios请求cnode社区的API。
    请点击这里

    axios的封装


    上一步已经实现用axios请求网络资源,那为什么要封装axios呢?

    以下几点原因:

    • 配置通用项
    • 统一处理请求错误,进行提示

    完整源码

    请点击这里

    请求流程

    请求完整流程

    请求失败

    通常请求失败有两种原因:

    • 网络异常/服务器宕机
    • 后端抛出错误

    每个后端在请求失败时返回的数据结构大同小异,前后端可以商量好,我的后台返回给我的请求失败接口如下:

    {
      "status": 1,
      "msg": "购物车为空",
      "success": false
    }
    

    如果只是普通用法,如下所示:

    axios.post('/user' , {
      params: {
        firstName: 'Fred',
        lastName: 'Flintstone'
      }
    })
      .then(function (response) {
        // 处理响应
        // 其中存在后端返回的错误
      })
      .catch(function (error) {
        // 网络异常引发的错误
      });
    

    我们知道,一般中大型规模的项目,请求是比较多的,这样导致代码冗余,会越来越臃肿,我们可以对错误进行预处理。

    拦截器

    在普通用法中,then()处理响应,catch()处理错误,通过拦截器,可以提前判断,并返回二者之一。

    这里并没有在拦截器中对错误进行处理,而是将响应或者错误返回到get/post请求的结果中,通过链式处理。

    // 请求时的拦截
    axios.interceptors.request.use(function (config) {
        // 发送请求之前做一些处理
        return config;
      }, function (error) {
        // 当请求异常时做一些处理
        return Promise.reject(error);
      });
    
    // 响应时拦截
    axios.interceptors.response.use(function (response) {
        // 返回响应时做一些处理
        return response;
      }, function (error) {
        // 当响应异常时做一些处理
        return Promise.reject(error);
      });
    

    封装get,post方法

    封装的get/post方法由3部分组成:

    链式处理
    • 基本配置
      包括请求方法,基础url,相对url,参数,超时时间,请求头等。
    • checkStatus()
      链式处理第一步,判断http状态码是否正常,和拦截器一样,请求正常则返回响应,请求异常则返回错误,最后返回结果给checkCode()。
    • checkCode()
      链式处理第二步,处理上一步的结果,分别处理网络异常,以及后端返回的异常。

    在组件中引用

    注: 使用babel-preset-stage-3才可保证async和await正常使用。

    引入封装后的axios

    import http from '../utils/http'
    import api from '../utils/api'
    

    使用方法

    fetchData: async function () {
          let params = {
          }
          const res = await http.get(api.right, params)
          if (res.data.success) {
            alert('请求成功')
          }
        }
    

    参考

    非原创,在以下文章基础上修改而成。
    vue中统一处理ajax错误

    相关文章

      网友评论

      • 江南雨t:你好,请问用你这个跨域怎么设置啊?
        江南雨t:@回调的幸福时光 已经搞定了,谢谢!
        回调的幸福时光:@江南雨t 跨域可以用proxy-table
      • 听风起_2a3c:post请求为什么参数传不进去,报404错误
        七月生岁:post参数是data不是params,他写错了
      • 佳少_ba75:怎么在heander里加token呢
        回调的幸福时光:@佳少_ba75 文章里面有github源码链接,可以在里面看
      • 切图仔_Howe:找了好多资料,就这篇能用上,谢谢。axios封装好了,接下来要是来个vuex+vue-router的干货,那我会以身相许的:kissing_heart:
        回调的幸福时光:@切图仔_Howe vue的相关文章太多了
      • 霄觉天:写的还是比较清楚的!
      • c3fac0c9c601:大哥大哥 那跨越 在config index.js中 配置 proxyTable 了 请求那边怎么修改呢 ?
        回调的幸福时光:@王老三_c3c @王老三_c3c5 改下baseUrl就行了
      • island8:已经有拦截器了,为什么还需要checkStatus和checkCode?响应处理可以分别在axios.interceptors.response的callback里和error处理吧

        比如:
        axios.interceptors.response.use(function (res) {
        //在相应请求之前做某件事
        // 做checkCode()的处理
        return response
        }, function (error) {
        // 做checkStatus()的处理
        }
        c3fac0c9c601:大哥大哥 那跨越 在config index.js中 配置 proxyTable 了 请求那边怎么修改呢 ?
        回调的幸福时光: @island8 checkStatus用来区分正常状态(200等)和错误状态(404),checkCode根据checkStatus的返回结果做进一步处理,正常就返回数据,错误就进行提示。
        但是checkStatus和checkCode都需要有响应,这里只是使用. then方法,你完全可以放到拦截器里面
      • z1900: 你好 请问怎样在vue里面使用 babel-preset-stage-3,要配置什么文件吗,用不了async await
        z1900:@回调的幸福时光 我在你的代码里面找到发现.babelrc这个文件,请问你是如何配置的
        z1900:@回调的幸福时光 我已经npm安装babel-preset-stage-3,请问应该怎样配置,对babel这个不了解,谢谢
        回调的幸福时光: @C16 在. babelrc文件中设置,并且需要npm安装babel-preset-stage-3依赖
      • Wrestle_Mania:大兄弟,post参数写错了吧
        回调的幸福时光: @JonSnowJY 呃呃,可以贴出来代码吗?我看了下文章里面的post函数,这种传参方式也可以吧。
      • aa237225703c:如果不用async函数,会出现问题么?不用的话应该用什么代替?
        回调的幸福时光: @这个年纪_e8d8 你封装axios的时候,保留两个参数,分别是resolve,reject,这两个参数传递的是函数,reresolve是成功时执行,reject是失败时执行
        aa237225703c:@回调的幸福时光 昨天仿照您的方式也封装了 一个 未用async函数 结果是收到响应但是却无法获取数据 因为正常的函数直接调用了,不是异步执行 所以数据回来的时候函数已经执行完了,这要怎么解决?写个setTimeout?还没有试。。我还是老老实实的配置了babel 用async函数。。
        回调的幸福时光: @这个年纪_e8d8 并不是必须要用async,axios执行异步请求后返回的是一个promise对象。根据我以往的经验,this在异步函数中会发生错误指向,需要`let that = this`,这样才可以在response的回调函数中正确指向。
      • d8bfd9bb3c4c:你好我发发送请求后,如果写的是错误的地址,这两个函数checkStatus()和checkCode()都不会执行的
        d8bfd9bb3c4c:@d8bfd9bb3c4c 实在google浏览器测试的
        d8bfd9bb3c4c:@回调的幸福时光 两个函数都执行的,我是在vuex里用的
        回调的幸福时光: @d8bfd9bb3c4c你试下写的是正确地址,这两个函数会不会执行,用Chrome浏览器,浏览器对async的支持有限,需要配置babel。
      • d8bfd9bb3c4c:你好调用时await是干什么用的呢?
        回调的幸福时光: @d8bfd9bb3c4c 是es7的草案,支持异步请求,你可以研究下😬
      • 零度的冰:需要websocket

      本文标题:Vue 2.0封装axios笔记

      本文链接:https://www.haomeiwen.com/subject/wvbotxtx.html