0. 系列文章

1.使用Typescript重构axios(一)——写在最前面

2.使用Typescript重构axios(二)——项目起手,跑通流程

3.使用Typescript重构axios(三)——实现基础功能:处理get请求url参数

4.使用Typescript重构axios(四)——实现基础功能:处理post请求参数

5.使用Typescript重构axios(五)——实现基础功能:处理请求的header

6.使用Typescript重构axios(六)——实现基础功能:获取响应数据

7.使用Typescript重构axios(七)——实现基础功能:处理响应header

8.使用Typescript重构axios(八)——实现基础功能:处理响应data

9.使用Typescript重构axios(九)——异常处理:基础版

10.使用Typescript重构axios(十)——异常处理:增强版

11.使用Typescript重构axios(十一)——接口扩展

12.使用Typescript重构axios(十二)——增加参数

13.使用Typescript重构axios(十三)——让响应数据支持泛型

14.使用Typescript重构axios(十四)——实现拦截器

15.使用Typescript重构axios(十五)——默认配置

16.使用Typescript重构axios(十六)——请求和响应数据配置化

17.使用Typescript重构axios(十七)——增加axios.create

18.使用Typescript重构axios(十八)——请求取消功能:总体思路

19.使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式

20.使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式

21.使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口

22.使用Typescript重构axios(二十二)——请求取消功能:收尾

23.使用Typescript重构axios(二十三)——添加withCredentials属性

24.使用Typescript重构axios(二十四)——防御XSRF攻击

25.使用Typescript重构axios(二十五)——文件上传下载进度监控

26.使用Typescript重构axios(二十六)——添加HTTP授权auth属性

27.使用Typescript重构axios(二十七)——添加请求状态码合法性校验

28.使用Typescript重构axios(二十八)——自定义序列化请求参数

29.使用Typescript重构axios(二十九)——添加baseURL

30.使用Typescript重构axios(三十)——添加axios.getUri方法

31.使用Typescript重构axios(三十一)——添加axios.all和axios.spread方法

32.使用Typescript重构axios(三十二)——写在最后面(总结)

项目源码请猛戳这里!!!

1. 前言

在之前的文章中,我们一直都是使用axios(config)来创建一个axios实例对象,然后发送请求。这样做表面上看起来似乎没什么问题,但是别忘了,我们在各个地方使用的axios其实是同一个实例对象,这样就有一个问题,如果我修改了这个实例对象的默认配置,那么所有的axios实例都会受到影响,进而影响到所有的请求。这不是我们想要的,我们想要的是能够创建出多个axios实例对象来,例如:我们可以创建出一个axiosLogInstance实例对象,该实例对象专门用来做跟日志相关操作的请求,并且给它配一些跟日志请求相关的默认配置;我们还可以再创建出一个axiosUserInstance实例对象,该实例对象专门用来做跟用户相关的请求,并且给它配一些跟用户请求相关的默认配置。这两个实例对象互不影响,这才是我们想要的结果。好在官方axios为我们提供了axios.create()静态接口,我们通过调用该接口可以创建出一个崭新的实例对象,该对象接收一个AxiosRequestConfig类型的参数作为该实例的默认配置对象,也不可以不传参数表示没有默认配置,它返回一个实例对象,我们可以像之前使用axios对象那样使用返回的这个实例对象,并且会它做一些自定义配置。说了这么多,不如看代码一目了然,伪代码如下:

const axiosLogInstance = axios.create({
baseURL: '',
timeout: 0,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}) axiosLogInstance({
url: '/log',
method: 'post',
data: {
a: 1
}
})

OK,了解了作用以后,我们就来给我们的axios混合对象上增加create静态接口。

2. 定义接口类型

由于 我们要给axios混合对象上 扩展一个静态接口,因此我们先来修改之前的定义的AxiosInstance接口类型。之前axios混合对象上的requestgetpost...等这些实例方法,这些方法的接口类型都定义在了AxiosInstance里面,为了区别于这些方法,我们新创建一个接口类型AxiosStatic,并将其继承自AxiosInstance,该类型用于定义create和后面讲到的allspread等静态接口,它的定义如下:

export interface AxiosStatic extends AxiosInstance{
create(config?:AxiosRequestConfig):AxiosInstance
}

create 函数可以接受一个 AxiosRequestConfig 类型的配置,作为默认配置的扩展,也可以接受不传参数。

OK,接口类型定义好之后,我们就来实现create接口。

3. 实现create接口

实现起来也很容易,该接口支持接收一个 AxiosRequestConfig 类型的配置对象,把该配置对象和全局的默认配置对象进行合并,作为将来返回的新axios实例对象的默认配置,最后使用getAxios创建出一个新的实例对象返回即可。我们把实现逻辑写在src/axios.ts内,如下:

import { AxiosRequestConfig, AxiosStatic } from "./types";
import Axios from "./core/Axios";
import { extend } from "./helpers/util";
import defaults from "./defaultes";
import mergeConfig from "./core/mergeConfig"; function getAxios(config: AxiosRequestConfig): AxiosStatic {
const context = new Axios(config);
const axios = Axios.prototype.request.bind(context); extend(axios, context); return axios as AxiosStatic;
} const axios = getAxios(defaults); axios.create = function(config: AxiosRequestConfig) {
return getAxios(mergeConfig(defaults, config));
}; export default axios;

OK,接口的逻辑就实现好了,接下来我们就编写demo来测试效果如何。

4. demo编写

examples 目录下创建 expandCreateInterface目录,在 expandCreateInterface目录下创建 index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>expandCreateInterface demo</title>
</head>
<body>
<script src="/__build__/expandCreateInterface.js"></script>
</body>
</html>

接着再创建 app.ts 作为入口文件:

import axios from "../../src/axios";
import qs from "qs"; const instance1 = axios.create({
headers: {
NLRX: "Hello NLRX"
}
}); instance1({
url: "/api/expandCreateInterface",
method: "post",
data: qs.stringify({
a: 1
})
}).then(res => {
console.log(res.data);
}); const instance2 = axios.create({
headers: {
test: "123"
}
}); instance2({
url: "/api/expandCreateInterface",
method: "post",
data: qs.stringify({
a:1
})
}).then(res => {
console.log(res.data);
});

在该demo中,我们使用axios.create创建了两个实例instance1instance2,在这两个实例中,我们在创建的时候给它们的headers里面设置了不同的内容,其余均相同,然后用这两个实例分别发出请求,如果在结果中这两个请求的headers确实不同,表明这两个实例互相独立,互不影响。

接着在 server/server.js 添加新的接口路由:

// 添加create接口
router.post("/api/expandCreateInterface", function(req, res) {
res.json(req.body);
});

最后在根目录下的index.html中加上启动该demo的入口:

<li><a href="examples/expandCreateInterface">expandCreateInterface</a></li>

OK,我们在命令行中执行:

# 同时开启客户端和服务端
npm run server | npm start

接着我们打开 chrome 浏览器,访问 http://localhost:8000/ 即可访问我们的 demo 了,我们点击 expandCreateInterface,通过F12network 部分我们可以看到请求已正常发出,并且请求的headers如下:



从上图的结果中看,两个请求的headers确实不同,验证了这两个实例发出的请求互相独立,互不相同,OK,create接口就增加完毕了。

(完)

使用Typescript重构axios(十七)——增加axios.create接口的更多相关文章

  1. 使用Typescript重构axios(十二)——增加参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  2. 使用Typescript重构axios(二十七)——添加请求状态码合法性校验

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  3. 使用Typescript重构axios(一)——写在最前面

    0.系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三)- ...

  4. 使用Typescript重构axios(二)——项目起手,跑通流程

    0.系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三)- ...

  5. 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. 使用Typescript重构axios(四)——实现基础功能:处理post请求参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. 使用Typescript重构axios(五)——实现基础功能:处理请求的header

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  8. 使用Typescript重构axios(六)——实现基础功能:获取响应数据

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. 使用Typescript重构axios(七)——实现基础功能:处理响应header

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?

    线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间. 一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现.同上一个问题,线程调度并不受到 Java 虚拟 ...

  2. Mac 10.14在新窗口中打开文件夹

    Mac 10.14 Open folders in new window (high Sierra) System Preferences > Dock. Change "Prefer ...

  3. Oracle11g安装与基本使用

    目录 安装 修改用户密码 配置文件修改 使用PLSQL连接Oracle数据库 如何执行SQL 语句 本教程基于oracle11g和PLSQL进行 下载资源见百度网盘链接:https://pan.bai ...

  4. CTFd平台部署

    学校要办ctf了,自己一个人给学校搭建踩了好多坑啊..这里记录一下吧 心累心累 这里只记录尝试成功的过程 有些尝试失败的就没贴上来 为各位搭建的时候节省一部分时间吧. ubuntu18搭建 0x01 ...

  5. [网络流 24 题] luoguP4016 负载平衡问题

    [返回网络流 24 题索引] 题目描述 有成环状的 nnn 堆纸牌,现将一张纸牌移动到其邻堆称为一次操作.求使得所有堆纸牌数相等的最少移动次数. Solution 4016\text{Solution ...

  6. eclipse 中配置maven环境

    选择 菜单栏 window -preferences-maven- installations 点击add 添加自己的maven 库 配置 setting 第一个为全局配置 第二个为用户配置可以覆盖全 ...

  7. 别再让你的微服务裸奔了,基于 Spring Session & Spring Security 微服务权限控制

    微服务架构 网关:路由用户请求到指定服务,转发前端 Cookie 中包含的 Session 信息: 用户服务:用户登录认证(Authentication),用户授权(Authority),用户管理(R ...

  8. Swagger Learing - Spring Boot 整合swagger

    学习了一下swagger. 这是编写的Demo 源码 https://github.com/AmberBar/Learning/tree/master/swagger-learning/swagger ...

  9. webpack 4.x 初级学习记录

    首先声明下,本人不擅长文字表达,文采不行,所以文章中文字较少,请看代码,初级学习,不足之处请多多指教 GitHub链接 看云kancloud [TOC] webpack 4.x 安装 首先需要在全局中 ...

  10. python模块的导入详解

    一:一个小问题:什么是模块? 我的理解是:有通用功能的文件的集合. 二:为什么要使用模块? 我们通常为了使自己以前写的东西保存下来,会把东西写入文件中保存下来,必要时我们把这些文件当脚本去执行,也可以 ...