axios封装学习

作者: alanwhy | 来源:发表于2019-08-03 16:34 被阅读2次

    视频地址:https://www.imooc.com/learn/1152
    源码链接:https://github.com/alanwhy/axios-api

    业务场景是实现一个用户信息列表,具有增删改查的功能,页面操作本文不做说明,具体可以查看源码链接运行看

    axios封装文件目录

    axios-app
      |- service
        |- contactApi.js // api的url等
        |- http.js // 封装文件
      |- views
        |- List.vue 
    

    api的封装

    const CONTACT_API = {
      // 获取用户的列表
      getContactList: {
        method: "get",
        url: "/contactList"
      },
      // from-data类型的新增数据
      newContactFrom: {
        method: "post",
        url: "/contact/new/form"
      },
      // json类型的新增数据
      newContactJson: {
        method: "post",
        url: "/contact/new/json"
      },
      // 编辑数据
      editContact: {
        method: "put",
        url: "/contact/edit"
      },
      // 删除数据
      delContact: {
        method: "delete",
        url: "/contact"
      }
    }
    export default CONTACT_API
    

    axios的封装

    import axios from "axios"
    // 引入上面文件封装的api路径
    import service from "./contactApi"
    // 提示框的引入 用于拦截器的信息提醒 提高用户体验
    import {
      Toast
    } from "vant"
    
    // 新建axios实例 设置好baseurl及过期时间
    // axios的默认过期时间就是1000,所以这里不写也是ok的
    let instance = axios.create({
      baseURL: "http://192.168.1.10:9000/api",
      timeout: 1000
    })
    
    const Http = {} // 包裹请求方法的容器 
    
    // 请求格式统一
    for (let key in service) {
      // 拿到每一个API的对象
      let api = service[key]
      // 采用async-await,避免回调地狱
      // params 主要用于post,put,patch等请求参数,get等需要具体参数,见后面代码
      // isFormData 区分form-data
      // config 配置参数 如header,token等
      Http[key] = async function (
        params,
        isFormData = false,
        config = {}
      ) {
        let newParams = {}
        // formdata做特殊的判断
        if (params && isFormData) {
          newParams = new FormData()
          for (let i in params) {
            newParams.append(i, params[i])
          }
        } else {
          newParams = params
        }
    
        // 不同请求的判断
        let response = {} // 请求的返回值
        if (api.method === "put" || api.method === "post" || api.method === "patch") {
          try {
            response = await instance[api.method](api.url, newParams, config)
          } catch (e) {
            response = e
          }
        } else if (api.method === "delete" || api.method === "get") {
          config.params = newParams
          try {
            response = await instance[api.method](api.url, config)
          } catch (e) {
            response = e
          }
        }
        return response
      }
    }
    
    // 请求拦截器
    instance.interceptors.request.use(config => {
      // 请求前 do something
      // 此处为弹出提示框
      Toast.loading({
        mask: false,
        duration: 0,
        forbidClick: true,
        message: "加载中..."
      })
      return config
    }, e => {
      Toast.clear()
      Toast(e.message)
    })
    
    // 响应拦截器
    instance.interceptors.response.use(res => {
      // 响应后 do something
      // 关闭弹出框
      Toast.clear()
      return res.data
    }, e => {
      Toast.clear()
      Toast(e.message)
    })
    
    export default Http
    

    暴露全局

    到main.js中加入代码

    ...
    import Http from "./service/http"
    // 把http挂载到vue实例上
    Vue.prototype.$Http = Http
    ...
    

    接口请求使用方式举例

      // 获取用户信息
        async getList() {
          let res = await this.$Http.getContactList();
          this.list = res.data;
        },
        // 修改和新增用户
        async onSave(info) {
          if (this.isEdit) {
            let res = await this.$Http.editContact(info);
            if (res.code == 200) {
              this.$toast("编辑成功!");
              this.showEdit = false;
              this.getList();
            }
          } else {
            let res = await this.$Http.newContactJson(info);
            if (res.code == 200) {
              this.$toast("新建成功!");
              this.showEdit = false;
              this.getList();
            }
          }
        },
        // 删除用户
        async onDelete(info) {
          let res = await this.$Http.delContact({
            id: info.id
          });
          if (res.code == 200) {
            this.$toast("删除成功!");
            this.showEdit = false;
            this.getList();
          }
        }
    

    相关文章

      网友评论

        本文标题:axios封装学习

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