Axios封装

Axios简介

axios 是一个轻量的 HTTP客户端,它基于 XMLHttpRequest 服务来执行 HTTP 请求,支持丰富的配置,支持 Promise,支持浏览器端和 Node.js 端。

axiosAPI 链接 API

Axios原生请求

使用原生Axios代码实现数据请求,代码大概是这样的:

axios('http://localhost:5000/getSomeData', {
  method: 'GET',
  timeout: 1000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'xxx',
  },
  transformRequest: [function (data, headers) {
    return data;
  }]
})
.then((res) => {
  // 业务逻辑代码
  console.log(res);
}, (err) => {
  if (err.response.status === 401) {
  // handle authorization error
  }
  if (err.response.status === 403) {
  // handle server forbidden error
  }
  // 其他错误处理.....
  console.log(err);
})

可以看出在这段代码中很多都是重复代码,只有业务逻辑代码是真正需要操作的。

因此,对 axios 进行封装,提高代码的复用性,能够提高开发效率,减少代码冗余

Axios封装

  1. 在src中创建utils/http.js文件

  2. 引入axios

    import axios from 'axios';
    
  3. 根据环境变量区分接口默认地址

    switch (process.env.NODE_ENV) {
      case "production":
        // 生产环境
        axios.defaults.baseURL = 'http://localhost:5000';
        break;
      case "test":
        // 测试环境
        axios.defaults.baseURL = 'http://localhost:5000';
      default:
        // 默认为开发环境
        axios.defaults.baseURL = 'http://localhost:5000';
    }
    
  4. 设置超时和跨域请求是否允许携带凭证

    axios.defaults.timeout = 10000;
    axios.defaults.withCredentials = true;
    
  5. 设置POST请求头

    axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';
    axios.defaults.transformRequest = data => qs.stringify(data);
    
  6. 设置请求拦截器

    axios.interceptors.request.use(config => {
      let token = localStorage.getItem('token');
      token && (config.headers.Authorization = token);
      return config;
    }, error => {
      return new Promise.reject(error);
    });
    
  7. 响应拦截器

    axios.defaults.validateStatus = status => {
      // 自定义响应成功的HTTP状态码
      return /^(2|3)\d{2}$/.test(status);
    }
    
    axios.interceptors.response.use(response => {
      // 返回响应主体中的信息
      return response.data;
    }, error => {
      let { response } = error;
      if (response) {
        switch (response.status) {
          //根据不同的状态码进行不同处理
          case 401: //用户未登录状态
            break;
          case 403: // 服务器拒绝执行(token过期)
            localStorage.removeItem('token');
            // 跳转到登录页
            break;
          case 404: // 服务器无对应资源
            // 跳转到404error页
            break;
        }
        return Promise.reject(error.response);
      } else {
        // 断网处理
        if (!window.navigator.onLine) {
          // 跳转断网页面
          return;
        }
        return Promise.reject(error);
      }
    })
    
  8. 默认导出axios

    export default axios;
    

Axios封装api使用

  • 在src目录下创建 api 文件夹,把所有关于HTTP请求的接口都放到这个文件夹中管理

  • 创建接口请求文件,例如 user.js ,用于请求用户相关信息

    import axios from '@/utils/http';
    function login(params) {
        return axios.get('/login', params);
    }
    function userInfo(params) {
        return axios.get('/getUserInfo', params);
    }
    
    export default {
        login,
        userInfo
    }
    
  • api 目录下创建 index.js ,用于统筹管理所有的接口文件

    import user from './user';
    
    export default {
        user
    }
    
  • main.js 中引入 api/index.js ,并指向Vue的原型链上

    import api from '@/api/index';
    Vue.prototype.$api = api;
    
  • 这样项目就可以全局使用 $api 来执行HTTP请求了

    <template>
      <div class="home">
        <h1>This is home page</h1>
      </div>
    </template>
    <script>
    export default {
      name: 'home',
      methods: {
        userInfo() {
           this
             .$api
             .user
             .userInfo(params) //axios请求在这里
             .then((res) => {
               // TODO res数据
             })
             .catch((err) => {
               // 打印error
           })    
        } 
          
      },
    };
    </script>
    

总结

  1. 封装可以让我们在开发中提高效率,减少代码冗余,增加可维护性和bug定位;
  2. axios 封装没有绝对标准,只要满足你的项目需求,就算是一个优秀的封装方案;
  3. 以上是Vue框架下的axios,不使用vue的情况下,也可以选择直接在组件中导入 api 使用。

源码链接 Github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值