axios库的核心代码解析及总结

目录
  • 一、关键步骤
    • 1.创建axios对象
    • 2.请求
  • 二、Axios类
    • 1.基础属性
    • 2.辅助方法
    • 3.request方法
  • 三、adpter适配器
    • 1.xhradpter
    • 2.httpadpter

一、关键步骤

1.创建axios对象

axios库导出的对象是一个已经被创建好的axios对象,它本质上是一个方法,可以直接接收一个config配置参数进行请求。在库的入口处,即可看到如下代码:

function createInstance(defaultConfig) {
  // 传入默认配置生成axios对象
  const context = new Axios(defaultConfig);
  // 本质是request方法,this上下文绑定context
  const instance = bind(Axios.prototype.request, context);
  // 将Axios原型上的属性复制到instance
  utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});
  // 将context上的属性复制到instance
  utils.extend(instance, context, {allOwnKeys: true});
  // 暴露create工厂方法供外部创建自定义的axios对象
  instance.create = function create(instanceConfig) {
    return createInstance(mergeConfig(defaultConfig, instanceConfig));
  };

  return instance;
}
// 默认暴露的axios对象
const axios = createInstance(defaults);

上述代码是创建默认axios对象的流程,这个对象上有Axios类的实例属性以及原型上的方法,且自身的是一个request方法,整个库最核心的也就是这个request方法。

2.请求

Axios的原型上存在很多辅助方法,如get,post,put等等,这些方法最终都会调用request方法,且默认设置了请求参数中的method属性,仅仅是一种封装的快捷调用方式。所以直接使用axios方法(axios的本质是一个方法),传入一个合法参数和使用axios.get等方法进行请求没有区别

二、Axios类

1.基础属性

axios类型的对象,存在2个基础属性

  • defaults:默认的请求参数
  • interceptors:请求和响应的拦截器

2.辅助方法

axios类型的对象存在很多辅助方法,如下:

  • delete
  • get
  • head
  • options
  • post
  • put
  • patch
  • postForm
  • patchForm
  • putForm

这些方法本质上都是request的封装,调用这些方法时,都会调用request方法,但相应的会预设置部分请求参数,如method和headers

3.request方法

这个方法是整个库的核心,它接收一个配置作为参数。内部流程如下:

  • (1)参数合并

axios对象在创建时,会传入一个默认请求配置对象,这个对象会和请求时传入的请求配置对象进行合并。

  • (2)处理headers

合并后的对象需要进一步处理headers,一些headers配置只针对特定类型的请求,如get类型。

  • (3)运行执行队列

这一步是整个request设计的较为精妙的地方。执行队列有2种执行模式,同步模式和异步模式,默认为异步模式。分别如下:

  • 异步模式

  • 同步模式

简单来说,就是request拦截器,request请求,response拦截器一起组成了一个执行队列。在异步模式下,队列里面每一个执行方法执行完成之后,会继续调用下一个执行方法。同步模式下,request拦截器和request请求会按顺序同步执行,但response拦截器会在请求返回后异步执行

三、adpter适配器

Axios库是跨平台的,可以在node环境和web环境同时使用。因此内部有个"适配器"的概念,adpter是一个方法,一个请求本质上就是调用这个方法,方法必须返回一个Promise对象。请求配置中,甚至可以让我们自己去实现自己的适配器。

// `adapter` 允许自定义处理请求,这使测试更加容易。 // 返回一个 promise 并提供一个有效的响应 (参见 lib/adapters/README.md)。

adapter: function (config) { /* ... */ },

如果提供了这么一个参数,那么将不会采用默认的适配器,一般供测试使用。

1.xhradpter

xhradpter适配器适用于web环境,利用XMLHttpRequest对象实现。本质上就是在操作一个XMLHttpRequest对象。

2.httpadpter

httpadpter适配器适用于node环境,利用node原生的http模块实现。

以上就是axios库的核心代码解析及总结的详细内容,更多关于axios库核心代码的资料请关注我们其它相关文章!

(0)

相关推荐

  • Vue axios库发送请求的示例介绍

    目录 1.什么是axios 2.axios请求图例 3.使用 async 和 await 配合 axios 发起请求 4.使用解构赋值 5.使用 axios.get() axios.post() 来简化请求过程 1.什么是axios Axios,是一个基于 promise 的网络请求库,作用于node.js和浏览器中,它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中). 使用方式如下: <script> //调用axios方法得到的返回值是 promise 对象

  • Vue3 (五)集成HTTP库axios详情

    目录 一.安装 axios 二.axios的使用 1.在主页中引用 axios 2.重新启动服务 3.何为跨域? 4.解决跨域问题 5.重新启动后端服务,再次访问 三.结论 一.安装 axios npm install axios@0.21.0 --save 二.axios的使用 1.在主页中引用 axios 在Vue3新增了setup初始化方法,所以我们在这里开始使用并测试,示例代码如下: <template> <a-layout> <a-layout-sider widt

  • VUE中使用HTTP库Axios方法详解

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 安装Axios模块 在Vue中使用,最好安装两个模块axios 和vue-axios $npm install axios vue-axios --save 然后引用并使用模块 import Axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios,Axios) 在组件中通过如下方式进行使用 this.$http[meth

  • vue日常开发基础Axios网络库封装

    目录 引言 axios使用 配置请求基本信息 设置请求拦截器 设置请求响应器 项目中使用 结尾 引言 首先Axios,一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 网络请求库无疑是项目开发中最基础的建设了,在这个前后端分离的时代,市面上有不少优秀的请求库,其中Axios就是优秀代表之一. 拦截请求和响应 转换请求数据和响应数据 自动转换 JSON 数据 客户端支持防御 XSRF 支持 PromiseAPI 以上是axios的优秀点 axios使用 本文是基于

  • 解析vue 3.0 使用axios库发起 post get 的配置过程

    get post 请求开发中最普通最常见的请求方式 但是在vue 中如何实现呢 这里记录一下配置过程, 首先在src 目录下新建 api 文件夹 在文件夹下新建 request.js 请求基类 // 请求配置过程的代码是这样的 import axios from "axios"; const requests = axios.create({ // 配置对象 baseURL: "", // 这里写自己的域名 timeout: 5000, // withCredent

  • axios库的核心代码解析及总结

    目录 一.关键步骤 1.创建axios对象 2.请求 二.Axios类 1.基础属性 2.辅助方法 3.request方法 三.adpter适配器 1.xhradpter 2.httpadpter 一.关键步骤 1.创建axios对象 axios库导出的对象是一个已经被创建好的axios对象,它本质上是一个方法,可以直接接收一个config配置参数进行请求.在库的入口处,即可看到如下代码: function createInstance(defaultConfig) { // 传入默认配置生成a

  • Java线程池框架核心代码解析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过程和执行过程解耦开来,并用Runnable表示任务. 下面,我们来分析一下 Java 线程池框架的实现ThreadPoolExecutor. 下面的分析基于JDK1.7 生命周期 ThreadPoolExecutor中,使用CAPACITY的高3位来表示运行状态,分别是:  1.RUNNING:接收

  • C/C++ Qt 运用JSON解析库的实例代码

    JSON是一种简单的轻量级数据交换格式,Qt库为JSON的相关操作提供了完整的类支持,使用JSON解析文件之前需要先通过TextStream流将文件读入到字符串变量内,然后再通过QJsonDocument等库对该JSON格式进行解析,以提取出我们所需字段. 首先创建一个解析文件,命名为config.json我们将通过代码依次解析这个JSON文件中的每一个参数,具体解析代码如下: { "blog": "https://www.cnblogs.com/lyshark",

  • 代码解析python标准库logging模块

    目录 问题1:如何获取caller的(文件名,行号,函数名)? findCaller内容如下: currentframe函数的定义: 问题2: Logger对象的层级,父子关系如何实现的? Manager的getLogger()定义如下: 问题1:如何获取caller的(文件名,行号,函数名)? 当新增一条log记录时,最终将调用Logger类的_log方法,这个方法首先会创建一个LogRecord对象.LogRecord对象需要(filename, lineno, funcname)参数信息.

  • 深入解析js轮播插件核心代码的实现过程

    轮播效果在网页中用的很多,swiper是其中最有代表性的作品,它支持水平和竖直滑动,还有反弹效果,兼容移动端和pc端.当然代码量也是相当大的,单是js就有5300行(3.4.0的未缩版本),若不考虑代码利用率和加载速度直接就用了,在移动端比较慎重,比如京东(m.jd.com)的轮播就没有用它,而是自己实现了类似的功能,代码量很少的样子(格式化之后看起来二三百行左右的样子).那么这个功能如果自己来实现,要怎么做呢? 准备工作 1. 准备几张图片(我这里放了四张) 2. 搭建目录结构(html+cs

  • Python 高级教程之线程进程和协程的代码解析

    目录 进程 进程 5 种基本状态 进程的特点 进程间数据共享 进程池 进程的缺点 线程 线程的定义 使用线程模块的简单示例 代码解析 协程 协程与线程 Python 协程 协程的执行 关闭协程 链接协程以创建管道 总结 进程 进程是指在系统中正在运行的一个应用程序,是 CPU 的最小工作单元. 进程 5 种基本状态 一个进程至少具有 5 种基本状态:初始态.就绪状态.等待(阻塞)状态.执行状态.终止状态. 初始状态:进程刚被创建,由于其他进程正占有CPU资源,所以得不到执行,只能处于初始状态.

  • Python中enumerate函数代码解析

    enumerate函数用于遍历序列中的元素以及它们的下标. enumerate函数说明: 函数原型:enumerate(sequence, [start=0]) 功能:将可循环序列sequence以start开始分别列出序列数据和数据下标 即对一个可遍历的数据对象(如列表.元组或字符串),enumerate会将该数据对象组合为一个索引序列,同时列出数据和数据下标. 举例说明: 存在一个sequence,对其使用enumerate将会得到如下结果: start        sequence[0]

  • Ajax的使用代码解析

    Ajax 简介 Ajax被认为是(Asynchronous(异步) JavaScript And Xml的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式 . 通常不用刷新网页而与服务器通讯的方法: Flash 框架 Frameset:如果使用一组框架构造了一个网页,可以只更新其中一个框架,而不必惊动整个页面 X

  • 从php核心代码分析require和include的区别

    深入理解PHP之require/include顺序 http://www.jb51.net/article/25867.htm普及在php手册中: require() is identical to include() except upon failure it will also produce a fatal E_ERROR level error. In other words, it will halt the script whereas include() only emits a

随机推荐