当前位置:网站首页>axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
2020-11-06 20:42:00 【叫我詹躲躲】
使用
XMLHttpRequest(XHR)对象可以与服务器交互。您可以从URL获取数据,而无需让整个的页面刷新。这允许网页在不影响用户的操作的情况下更新页面的局部内容。在 AJAX 编程中,XMLHttpRequest被大量使用。

1. 理解XHR
- 使用XMLHttpRequest(XHR)对象可以与服务器交互,也就是发送ajax请求
- 前端可以获取到数据,而无需让整个页面刷新
- 这使得Web页面可以只更新页面的局部,而不影响用户的操作
区别一般http请求与ajax请求
- ajax请求是一种特别的http请求
- 对服务器端来说,没有任何区别,区别在浏览器端
- 浏览器端发请求:只有XHR或fetch发出的才是ajax请求,其他的所有请求都是非ajax请求
- 浏览器端接收到响应
- (1) 一般请求: 浏览器一般会直接显示响应体数据, 也就是我们常说的刷新/跳转页面
(2) ajax 请求: 浏览器不会对界面进行任何更新操作, 只是调用监视的回调 函数并传入响应相关数
3. API
-
XMLHttpRequest():创建XHR对象的构造函数
-
status: 响应状态码值,比如200,404
-
statusText: 响应状态文本
-
readyState: 标识请求状态的只读属性
0: 初始<br /> 1: open()之后<br /> 2: send()之后<br /> 3: 请求中<br /> 4: 请求完成 -
onreadystatechange: 绑定readyState改变监听
-
responseType: 指定相应数据,如果是’json’,得到响应后自动解析响应体数据
-
response: 响应体数据,类型取决于responseType的指定
-
timeout: 指定请求超时时间,默认为0代表没限制
-
ontimeout: 绑定超时的监听
-
onerror: 绑定请求网络错误的监听
-
open(): 初始化一个请求, 参数为: (method, url[, async])
-
send(data): 发送请求
-
abort(): 中断请求
-
getResponseHeader(name): 获取指定名称的响应头值
-
getAllResponseHeaders(): 获取所有响应头组成的字符串
16. setRequestHeader(name, value): 设置请求头
4. XHR的ajax封装,也算是简单版的axios
4.1 特点
- 函数的返回值promise,成功的结果为response,异常的结果为error
- 能处理多种类型的请求:GET/POST/PUT/DELETE
- 函数的参数为一个配置对象
{
url: '', // 请求地址
method: '', // 请求方式 GET/POST/PUT/DELETE
params: {
}, // GET/DELETE 请求的 query 参数
data: {
}, // POST 或 DELETE 请求的请求体参数
}
- 响应json数据自动解析为js的对象/数组
4.2 简单版的axios源码
function axios({
url,
method='GET',
params={
},
data={
}
}) {
// 返回一个promise对象
return new Promise((resolve, reject) => {
// 处理method(转大写)
method = method.toUpperCase()
// 处理query参数(拼接到url上) id=1&xxx=abc
/* { id: 1, xxx: 'abc' } */
let queryString = ''
Object.keys(params).forEach(key => {
queryString += `${ key}=${ params[key]}&`
})
if (queryString) {
// id=1&xxx=abc&
// 去除最后的&
queryString = queryString.substring(0, queryString.length-1)
// 接到url
url += '?' + queryString
}
// 1. 执行异步ajax请求
// 创建xhr对象
const request = new XMLHttpRequest()
// 打开连接(初始化请求, 没有请求)
request.open(method, url, true)
// 发送请求
if (method==='GET' || method==='DELETE') {
request.send()
} else if (method==='POST' || method==='PUT'){
request.setRequestHeader('Content-Type', 'application/json;charset=utf-8') // 告诉服务器请求体的格式是json
request.send(JSON.stringify(data)) // 发送json格式请求体参数
}
// 绑定状态改变的监听
request.onreadystatechange = function () {
// 如果请求没有完成, 直接结束
if (request.readyState!==4) {
return
}
// 如果响应状态码在[200, 300)之间代表成功, 否则失败
const {
status, statusText} = request
// 2.1. 如果请求成功了, 调用resolve()
if (status>=200 && status<=299) {
// 准备结果数据对象response
const response = {
data: JSON.parse(request.response),
status,
statusText
}
resolve(response)
} else {
// 2.2. 如果请求失败了, 调用reject()
reject(new Error('request error status is ' + status))
}
}
})
}
版权声明
本文为[叫我詹躲躲]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/3995971/blog/4558937
边栏推荐
- EOS创始人BM: UE,UBI,URI有什么区别?
- Details of dapr implementing distributed stateful service
- Real time data synchronization scheme based on Flink SQL CDC
- Summary of common string algorithms
- After brushing leetcode's linked list topic, I found a secret!
- 合约交易系统开发|智能合约交易平台搭建
- TRON智能钱包PHP开发包【零TRX归集】
- Face to face Manual Chapter 16: explanation and implementation of fair lock of code peasant association lock and reentrantlock
- Did you blog today?
- Top 10 best big data analysis tools in 2020
猜你喜欢

带你学习ES5中新增的方法

Filecoin的经济模型与未来价值是如何支撑FIL币价格破千的

I'm afraid that the spread sequence calculation of arbitrage strategy is not as simple as you think

做外包真的很难,身为外包的我也无奈叹息。

I've been rejected by the product manager. Why don't you know

一篇文章带你了解CSS3圆角知识

Can't be asked again! Reentrantlock source code, drawing a look together!

比特币一度突破14000美元,即将面临美国大选考验

ipfs正舵者Filecoin落地正当时 FIL币价格破千来了

至联云解析:IPFS/Filecoin挖矿为什么这么难?
随机推荐
Process analysis of Python authentication mechanism based on JWT
Using consult to realize service discovery: instance ID customization
PHP应用对接Justswap专用开发包【JustSwap.PHP】
I've been rejected by the product manager. Why don't you know
速看!互联网、电商离线大数据分析最佳实践!(附网盘链接)
Want to do read-write separation, give you some small experience
TRON智能钱包PHP开发包【零TRX归集】
制造和新的自动化技术是什么?
合约交易系统开发|智能合约交易平台搭建
OPTIMIZER_ Trace details
Thoughts on interview of Ali CCO project team
htmlcss
Polkadot series (2) -- detailed explanation of mixed consensus
助力金融科技创新发展,ATFX走在行业最前列
教你轻松搞懂vue-codemirror的基本用法:主要实现代码编辑、验证提示、代码格式化
Why do private enterprises do party building? ——Special subject study of geek state holding Party branch
全球疫情加速互联网企业转型,区块链会是解药吗?
The choice of enterprise database is usually decided by the system architect - the newstack
In order to save money, I learned PHP in one day!
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...