Axios request 封装最佳实践——简化代码,提高可维护性

本文将介绍 Axios request 封装的一些知识,让项目更方便地调用接口,减少重复代码,并统一处理请求错误。

用 Apifox,节省研发团队的每一分钟

Axios request 封装最佳实践——简化代码,提高可维护性

免费使用 Apifox

相关推荐

最新文章

在实际项目中,我们通常需要封装 Axios 请求,这样可以更方便地处理请求和响应,也可以统一处理请求错误等,本文将介绍 Axios request 封装的一些知识。

Axios request 请求封装
Axios 官网首页

封装思想

我们可以将 Axios 封装成一个请求函数,传入请求配置参数,它负责发起请求。然后在请求成功时 resolve 返回数据,请求失败时 reject 返回错误。这样就可以通过 promise 方式非常方便地使用它。


基本结构如下:

function request(options) {
  return new Promise((resolve, reject) => {
    axios(options)
      .then(res => {
        resolve(res.data) 
      })
      .catch(err => {
        reject(err)
      })
  })
}


我们还可以接着封装 get、post 等方法:

function get(url, params) {
  return request({
    method: 'get',
    url,
    params
  }) 
}

function post(url, data) {
  return request({
    method: 'post',
    url,
    data
  })
}

这样我们就可以直接调用getpost方法发起对应请求了。

处理重复逻辑

我们可以把一些重复的逻辑抽离出来,比如设置 baseURL:

function request(options) {
  const instance = axios.create({
    baseURL: 'https://some-domain.com/api/',
    timeout: 5000
  })

  options = {...options, instance} // 使用创建的实例

  return new Promise((resolve, reject) => {
    instance(options)
      .then(res => {
        resolve(res.data)  
      })
      .catch(err => {
        reject(err) 
      })
  })
}

这样可以避免每次请求都要设置这些通用配置。

请求和响应拦截器

我们可以使用拦截器在发送每个请求前修改请求数据,以及在接收响应后统一处理响应结果。

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 处理请求前的逻辑...

    return config
  },
  error => {
    // 请求错误处理

    return Promise.reject(error)
  }
)

// 响应拦截器 
instance.interceptors.response.use(
  response => {
     // 处理响应数据

     return response
  },
  error => {
    // 处理响应错误

    return Promise.reject(error)
  }
)

拦截器让我们可以更加灵活自如地控制请求流程。

错误处理

我们可以通过 catch 来统一处理请求的错误。

function request(options) {
  return new Promise((resolve, reject) => {
    instance(options)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        // 错误处理

        reject(err) 
      })
  })
}

request(options)
  .then(res => {
    // 处理响应数据
  })
  .catch(err => {
    // 统一处理请求错误 
  })

这样可以避免每个请求都要独立处理错误的问题。

请求取消

有时候我们需要取消一个已发出的请求,Axios支持通过传递一个cancel token来取消请求:

const CancelToken = axios.CancelToken

const source = CancelToken.source()

request({
  ...,
  cancelToken: source.token
})

// 取消请求
source.cancel('Cancel request') 

这样我们可以更加灵活地控制请求。

案例

下面是一个请求实例,展示了如何使用上面封装的 request 方法:

import { get, post } from './request'

get('/user', { params: { id: 12345 }})
  .then(res => {
    console.log(res)  
  })
  .catch(err => {
    console.error(err)
  })

post('/user', { user: { name: 'John' }})
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.error(err)  
  }) 

通过 get 和 post 方法可以非常方便地发起对应请求,并通过 promise 处理响应结果。

提示与技巧

  • 将 Axios 封装成一个 request 方法,传入配置参数发起请求
  • 抽离公共配置代码如 baseURL 等
  • 使用拦截器处理请求和响应
  • 通过 catch 统一处理错误
  • 支持取消请求

使用 Apifox 来 Mock 数据

Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协议的接口,并且集成了 IDEA 插件。在后端人员写完服务接口时,测试阶段可以通过 Apifox 来校验接口的正确性,图形化界面极大的方便了项目的上线效率。

更为重要的是Apifox 能够 Mock 数据,其集成了 Mock.js 库,允许你自定义规则,并且可以编写脚本,强大的 Mock 功能可以让前端开发人员不再苦苦等待后端提供接口,自己就能提前造各种各样的数据出来,可视化操作让你点点鼠标就能生成可观的人性化数据。

Apifox 的 Mock 功能
Apifox 的 Mock 功能
使用 Apifox 调试接口
使用 Apifox 调试接口

总结

正确地封装 Axios 请求可以让我们更方便地调用接口,减少重复代码,并统一处理请求错误。上面提到的都是一些比较常见的封装方式,可以根据实际需求进行灵活调整。

知识扩展:


参考:

  • Axios中文文档:https://www.kancloud.cn/yunye/axios/234845