返回

axios 使用指南及源码解析

前端

axios 是一个基于 Promise 的 JavaScript HTTP 客户端库,可以在浏览器和 Node.js 环境中使用。它以其简单、易用和强大的功能而著称,是许多开发者的首选 HTTP 库。

axios 的使用

安装

要安装 axios,可以使用以下命令:

npm install axios

或者:

yarn add axios

使用

axios 的使用非常简单,只需以下几步:

  1. 导入 axios 库:
import axios from 'axios';
  1. 创建一个 axios 实例:
const axiosInstance = axios.create({
  baseURL: 'https://example.com/api',
  timeout: 1000,
});
  1. 使用 axios 实例发送请求:
axiosInstance.get('/users').then((response) => {
  console.log(response.data);
});

axios 提供了四种常用的请求方法:

  • get():用于发送 GET 请求。
  • post():用于发送 POST 请求。
  • put():用于发送 PUT 请求。
  • delete():用于发送 DELETE 请求。

axios 的源码解析

axios 的源码非常清晰易懂,我们一起来看看它是如何实现的。

axios.create()

export function create(config) {
  // 创建一个新的 axios 实例
  const context = new Context(config);

  // 将 axios 实例的原型方法添加到 context 对象上
  const instance = axios.extend(context);

  // 返回 axios 实例
  return instance;
}

axios.request()

export function request(config) {
  // 创建一个新的 axios 实例
  const context = new Context(config);

  // 调用 dispatch 方法发送请求
  return dispatchRequest(context);
}

dispatchRequest()

function dispatchRequest(context) {
  // 创建一个 Promise 对象
  let promise = Promise.resolve(context);

  // 循环执行每个拦截器
  while (context.interceptors.request.length) {
    // 获取第一个拦截器
    const interceptor = context.interceptors.request.shift();

    // 调用拦截器函数
    promise = promise.then(interceptor.fulfilled, interceptor.rejected);
  }

  // 发送请求
  promise = promise.then(sendAxiosRequest, Promise.reject).then((response) => {
    // 循环执行每个响应拦截器
    while (context.interceptors.response.length) {
      // 获取第一个响应拦截器
      const interceptor = context.interceptors.response.shift();

      // 调用响应拦截器函数
      response = response.then(interceptor.fulfilled, interceptor.rejected);
    }

    // 返回响应数据
    return response;
  }, (error) => {
    // 循环执行每个响应拦截器
    while (context.interceptors.response.length) {
      // 获取第一个响应拦截器
      const interceptor = context.interceptors.response.shift();

      // 调用响应拦截器函数
      error = error.then(interceptor.fulfilled, interceptor.rejected);
    }

    // 抛出错误
    return Promise.reject(error);
  });

  // 返回 Promise 对象
  return promise;
}

结语

axios 是一个非常强大的 HTTP 客户端库,本文只是对 axios 的使用和源码解析做了简单的介绍,还有很多细节没有涉及到。如果你想了解更多关于 axios 的内容,可以参考 axios 的官方文档。