美文网首页
React 中对 Axios 的基本封装

React 中对 Axios 的基本封装

作者: 三十文 | 来源:发表于2018-06-27 04:08 被阅读364次

一、Axios 简介

Promise based HTTP client for the browser and node.js
github:https://github.com/axios/axios

二、axios 的常用场景

  1. 对特定的状态码,进行特殊处理(如 4xx 状态码,统一重定向到 404 页面);
  2. get 请求封装;
  3. post 请求封装;
  4. 返回数据 json 中的特定 code,作统一处理(如后端接口定义 220 - 300
    的状态码,对返回文案需要统一进行弹框提示);
  5. 单页面的多接口的并发请求(await 导致的多余等待);

三、封装方案

预备工作

  1. 能够实现全局的开始 loading、结束 loading、文案弹框的基本组件或方法(个人项目中使用了 redux 来实现全局通用组件的控制和页面缓存的使用)
  2. es6 语法,并且能够支持 Promise,async,await 等语法

方法说明

// proxyUtil 该对象提供一系列操作 redux 中 store 数据方法,用来做全局组件的控制

// 显示 加载中 图标
proxyUtil.startLoading() 

// 关闭 加载中 图标
proxyUtil.endLoading()

// 全局文字提示弹框
proxyUtil.alertMessage(message: string)

详细代码

1、对特定请求状态码,进行特殊处理
import * as axios from 'axios'
// 全局设定请求类型
axios.defaults.headers.post['Content-Type'] = 'application/json'

// 根据 axios api,对请求返回做拦截处理
axios.interceptors.response.use(function (response) {
  if (response.status >= 400 && response.status < 500) {
      // 对返回状态码为 4xx 的请求统一处理
      // 此处统一跳转 404 页面
      window.location.href = decodeURI(`${window.location.protocol}//${window.location.host}/404.html`)
  } else {
    return response
  }
}, function (error) {
  proxyUtil.alertMessage(error)
})
2、get 请求封装
export function pget (url, params = {}) {
  // 开始 loading
  proxyUtil.startLoading()
  return axios.get(url, {
    params: params,
    validateStatus: function (status) {
      // axios 底层采用 Promise 实现,下方表达式表示只有返回 code 为 2xx 才被正常返回(resolve),非 2xx 全部当做异常(reject)
      return status >= 200 && status < 300
    }
  }).then(response => {
    // 结束 loading
    proxyUtil.endLoading()
    // 返回后端返回数据
    return response.data
  }).catch(error => {
    // 异常处理
    proxyUtil.endLoading()
    proxyUtil.alertMessage(error)
  })
}
3、post 请求封装
export function ppost (url, params = {}) {
  // 开始 loading
  proxyUtil.startLoading()
  return axios.post(url, params).then(response => {
    // 结束 loading
    proxyUtil.endLoading()
    return response.data
  }).catch(error => {
    // 异常处理
    proxyUtil.endLoading()
    proxyUtil.alertMessage(error)
  })
}
4、 返回数据 json 中的特定 code,作统一处理

这个只需要在 pget 方法或 ppost 方法中作特殊处理就行,以 pget 为例(TODO 处代码差异):

export function pget (url, params = {}) {
  // 开始 loading
  proxyUtil.startLoading()
  return axios.get(url, {
    params: params,
    validateStatus: function (status) {
      // axios 底层采用 Promise 实现,下方表达式表示只有返回 code 为 2xx 才被正常返回(resolve),非 2xx 全部当做异常(reject)
      return status >= 200 && status < 300
    }
  }).then(response => {
    // 结束 loading
    proxyUtil.endLoading()
    // TODO 假定接口返回数据格式为 { code: 200, msg: "这是信息" }
    // 获取接口自定义 code
    let code = response.data.code
    // 获取接口返回 message,也可能是一个 object,一个数组
    let message = response.data.msg
    // 对于接口定义的特殊范围的 code,统一对返回的 message 作弹框处理
    if (code > 220 || code < 200) {
      proxyUtil.alertMessage(message.toString())
    }
    // 返回后端返回数据
    return response.data
  }).catch(error => {
    // 异常处理
    proxyUtil.endLoading()
    proxyUtil.alertMessage(error)
  })
}
5、单页面的多接口的并发请求(await 导致的多余等待)
export function asyncAll (requests = []) {
  // 开始 loading
  proxyUtil.startLoading()
  // 使用 axios 的 all 方法
  return axios.all(requests).then(resultArr => {
    // 结束 loading
    proxyUtil.endLoading()
    // 对结果做特殊化处理,此处是对返回接口 code 在一定范围内作信息弹框
    for (let result of resultArr) {
      let code = result.code
      if (code > 220 || code < 200) {
        proxyUtil.alertMessage(result.msg)
      }
    }
    //  返回每个方法返回的接口数据
    return resultArr
  }).catch(error => {
    // 异常处理
    proxyUtil.endLoading()
    proxyUtil.alertMessage(error)
  })
}

使用范例:
假定有两个接口请求 getUserName() 和 getUserAge(),现在一个页面需要同时请求这两个接口的数据,await 逐步等待明显浪费时间,所以我们可以采用下方写法。

// 处理用户信息
async loadUserData() {
    let [nameObj, ageObj] = await asyncAll([getUserName(), getUserAge()])
    this.userInfo.name = nameObj.msg
    this.userInfo.age = ageObj.msg
    // react 此处更多是应该在得到数据处理完之后,setState({userName: nameObj.msg, userAge: ageObj.msg})
}

相关文章

  • React 中对 Axios 的基本封装

    一、Axios 简介 Promise based HTTP client for the browser and ...

  • (二)axios的封装

    axios封装代码 在vue和react的开发过程中,经常需要对axios进行封装,现将项目中的axios保留,以...

  • Vue3.0 项目中遇到的问题(十二)

    一. axios的基本使用 二. axios的初步封装 (1) 详细流程图: 三. axios 对有的实例...

  • axios 配置

    为了方便对 axios 操作,我们通常对 axios 进行二次封装。 1. 配置 axios 基本信息 建立 sr...

  • react 对axios简单封装

    在src 目录下 新建 api文件夹, 新建一个 baseApi.js还有 pages文件夹下的每个页面的文件对应...

  • 基于axios的二次封装

    1、 axios的封装前言 axios是一个基于 promise 的 HTTP 库,目前,在vue,react框架...

  • React封装axios

    安装axios 建立请求js index.js引入封装js

  • vue中axios的封装

    axios的封装会在项目开发中减少代码的书写量: 安装axios npm install axios -D 封装a...

  • 在VUE中科学使用axios

    在项目中安装axios 封装axios 新建api/index.js文件,对axios进行简单的封装,方便使用。真...

  • axios 封闭http请求

    公司用react开发项目,特意封装了一个axios请求 代码如下: 使用方式

网友评论

      本文标题:React 中对 Axios 的基本封装

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