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. 前言

在响应回来处理响应结果时,我们需要先判断一下XMLHttpRequest 响应中的数字状态码是否是一个合法值,如果是一个我们认定的合法值,那么我们就继续进行下一步操作,如果不是,则做其他操作,如抛出异常等。在之前的代码中,我们把判断响应状态码是否合法是直接写死在代码里的,我们简单的认为当状态码在200到300之间时候它是合法的,否则即为不合法。虽然这样符合大多数用户的业务场景,但是我们这样武断的直接写死在代码里显然是不行的,因为我们毕竟覆盖不了所有用户的业务场景。这就要求状态码合法性的校验规则应该是由用户可配置的。

而在官方axios中,在请求配置对象里提供了validateStatus属性,该属性值是一个状态码校验函数,接收状态码作为函数参数,返回校验结果truefalse,并且这个属性也在默认请求配置对象中。官方文档是这么介绍的:

// `validateStatus` defines whether to resolve or reject the promise for a given
// HTTP response status code. If `validateStatus` returns `true` (or is set to `null` or `undefined`),
// the promise will be resolved; otherwise, the promise will be rejected.
validateStatus: function (status) {
return status >= 200 && status < 300; // default
}

如果validateStatus函数返回true,或者validateStatus属性值被设置为null,或者没有用户配置了validateStatus属性但是没有定义校验函数的时候,都认为是合法的,正常 resolve(response),否则都会抛出异常。

搞明白官方axios中的validateStatus属性功能后,那么接下里,我们也要为我们的axios添加validateStatus属性,并实现其功能。

2. 向请求配置对象添加属性

向请求配置对象config中添加 validateStatus 属性之前,我们需要先在src/types/index.ts中的配置对象的接口类型定义AxiosRequestConfig上添加该属性的定义,如下:

export interface AxiosRequestConfig {
// 新增
validateStatus?: (status: Number) => Boolean;
}

添加好属性接口后,我们还要给默认请求配置对象src/default.ts中添加这两个属性,并且属性的默认值跟官方axios保持一直,如下:

const defaults: AxiosRequestConfig = {
// 新增
validateStatus(status: Number): boolean {
return status >= 200 && status < 300
}
};

3. 修改之前的状态码判断逻辑

在之前的代码中,我们把判断响应状态码是否合法是直接写死在代码里的,现在我们应该调用用户传入的状态码校验函数,用它来校验状态是否合法,如下:

function handleResponse(response: AxiosResponse): void {
if (!validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(
createError(
`Request failed with status code ${response.status}`,
config,
null,
request.status,
response
)
);
}
}

如果validateStatus函数返回true,或者validateStatus属性值被设置为null,或者没有用户配置了validateStatus属性但是没有定义校验函数的时候,都认为是合法的,正常 resolve(response),否则都会抛出异常。

OK,validateStatus属性就添加好了,并且状态码判断逻辑也修改了。接下来,我们就来编写demo来测试下效果如何。

4. demo编写

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

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

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

import axios from "../../src/axios";

axios.get("/api/checkStatus").then(res => {
console.log(res);
}); axios
.get("/api/checkStatus", {
validateStatus: status => status >= 200 && status < 400
})
.then(res => {
console.log(res);
});

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

// 请求状态码合法性校验
router.get("/api/checkStatus", function(req, res) {
res.status(304);
res.end();
});

在本demo我们发送了两个请求,一个请求没有配置validateStatus属性,它会使用默认请求对象中的validateStatus校验函数,即判断状态码是否在200到300之间;第二个请求我们配置了validateStatus属性,并且配置了校验函数,判断状态是否在200到400之间。另外,在服务端路由接口中,我们故意把响应状态设置为304,这样第一个请求就会校验不通过抛出异常,第二个请求将会校验通过。

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

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

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

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

接着我们打开 chrome 浏览器,访问 http://localhost:8000/ 即可访问我们的 demo 了,我们点击 checkStatus,就可以看到请求都已经正常发出,在控制台上第一个请求抛出了状态码异常,第二个请求正常响应了。

OK,以上就是为我们的axios添加validateStatus属性,并实现了其功能。

(完)

使用Typescript重构axios(二十七)——添加请求状态码合法性校验的更多相关文章

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

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

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

    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(二十六)——添加HTTP授权auth属性

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

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

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

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

    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(二十四)——防御XSRF攻击

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

随机推荐

  1. C++学习笔记-预备知识

    1.1 C++简介 C++融合3种不同的编程方式:C语言代表的过程性语言.C++在C语言基础上添加的类代表的面向对象语言.C++模板支持的广泛编程. 1.2 C++简史 1.2.1 C语言 Ritch ...

  2. Spring Boot 常用注解汇总

    一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...

  3. [洛谷] 通往奥格瑞玛的道路 [Vijos]

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  4. 一张图一个题帮你迅速理解RLU算法

    下面是某年的软考题: 某进程页面访问序列为4,2,3,1,2,4,5,3,1,2,3,5,且开始执行时内存中没有页面,分配给该进程的物理块数是3,则采用RLU页面置换算法时的缺页率是多少? 对于这个问 ...

  5. Jenkins构建Jmeter项目

    1.启动jenkins 2.新建自由风格的项目 定时任务 构建操作 安装HTML Publisher插件 构建后操作 最后保存构建,查看报告

  6. php函数fsockopen的使用

    函数说明:fsockopen — 打开一个网络连接或者一个Unix套接字连接 语法: resource fsockopen ( string $hostname [, int $port = -1 [ ...

  7. [CF544] D. Destroying Roads

    D. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. python 可变数量参数 ( 多参数返回求 参数个数,最大值,最大值)

    一. 自定义一串数字求 参数个数,最大值,最大值()---------方法一: def max(*a): m=a[0] p=a[0] n=0 for x in a: if x>m: m=x n+ ...

  9. 浏览器devtools系列(一)

    作为一个web开发人员免不了去和浏览器打交道,前端人员更是如此. 测试人员可能在代码测试的时候容易定位,问题出现在哪里. 不过供桌中常用的可能就是几个,比如前端人员经常看控制面板调试问题,打印后台数据 ...

  10. 微信小程序开发注意事项(优化项)

    最近公司有一个小程序开发项目,自己也自学了不少,有一些开发小心得,记录在这里. 小程序开发中注意: 1,setData 小程序视图层和逻辑层在两个独立的模块,并不具备数据直接传递的,setData相当 ...