使用Typescript重构axios(二十七)——添加请求状态码合法性校验
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
属性,该属性值是一个状态码校验函数,接收状态码作为函数参数,返回校验结果true
或false
,并且这个属性也在默认请求配置对象中。官方文档是这么介绍的:
// `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(二十七)——添加请求状态码合法性校验的更多相关文章
- 使用Typescript重构axios(二十三)——添加withCredentials属性
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十)——请求取消功能:实现第一种使用方式
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十二)——请求取消功能:收尾
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十六)——添加HTTP授权auth属性
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十八)——自定义序列化请求参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二十九)——添加baseURL
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(二)——项目起手,跑通流程
0.系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三)- ...
- 使用Typescript重构axios(二十四)——防御XSRF攻击
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
随机推荐
- Android系统介绍与框架
一.Andriod是什么? Android系统是Google开发的一款开源移动OS,Android中文名被国内用户俗称“安卓”.Android操作系统基于Linux内核设计,使用了Google公司自己 ...
- MQTT介绍与使用
物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段.其英文名称是:“Internet of things(IoT)”.顾名思义,物联网就是物物相连的互联网.这有两层意思:其一,物联 ...
- react-native开发经验
# **RN开发经验** ## 一.环境配置关于环境配置,前辈已有完整的总结:http://tvrn.devops.letv.com/docs/Environment.html **IDE准备:** ...
- C#学习--SQL server数据库基本操作(连接、增、删、改、查)封装
写在前面: 在日常的工作中,通常一个项目会大量用的数据库的各种基本操作,因此小编几个常见的数据库的操作封装成了一个dll方便后续的开发使用.SQLserver数据库是最为常见的一种数据库,本文则主要是 ...
- Hyper-V 下linux虚拟机静态IP上网配置的两种方式(2)
工作需要,搭建linux环境,网上搜了两种Hyper-V配置linux静态IP及上网的方式,记录一下,方便查阅,如下设置网络共享方式: win10下使用hyper-v在本机安装linux虚拟机后,网络 ...
- Qt5教程: (2) 信号与槽
1. 新建工程 新建一个"Qt Widgets Application"工程 2. 添加按钮 一个Qt工程会有很多个控件, 如果把逻辑代码都写在main函数里, main函数会非常 ...
- windows显示文件后缀名
win+E 进入到计算机 点击组织 点击文件夹和搜索选项 先点击查看,然后去掉勾选隐藏已知文件类型的扩展名
- Sieve of Eratosthenes时间复杂度的感性证明
上代码. #include<cstdio> #include<cstdlib> #include<cstring> #define reg register con ...
- opencv::视频人脸检测
视频流抓取人脸和眼睛 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using nam ...
- 【RabbitMQ 实战指南】一 RabbitMQ入门
1.消息中间件 1.1.什么是消息中间件 消息中间件(Message Queue Middleware,简称 MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通道来进行分布式系 ...