有一次面试官让我手写原生请求没写出来…..
还是太过于依赖axios中前人传下来的已经封装好的请求,这次也算是补全基础啦
AJAX
AJAX(Asynchronous JavaScript And XML),即异步的 JavaScript 和 XML,是一种用于创建快速动态网页的技术。它使用 XMLHttpRequest 对象来获取数据,并且使用 JavaScript 和 DOM 来处理这些数据。
封装一个ajax
const sendAjax = () => {
const xhr = new XMLHttpRequest()
//GET请求
xhr.open('GET', 'http://localhost:3000/api/getData',true)//第三个参数是是否异步,默认为true
//POST请求
xhr.open('POST', 'http://localhost:3000/api/getData',true)
xhr.setRequestHeader('Content-Type', 'application/json')//设置POST请求头
xhr.addEventListener('progress', (e) => {
progress.innerText = `${(e.loaded / e.total * 100).toFixed(2)}%`
}) //进度条
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText)
}
xhr.send(null);//get请求不需要传递参数
xhr.send(JSON.stringify({
name: '张三',
age: 18
})) // post请求需要传递参数,使用JSON.stringify()方法将参数转换为json格式
}
xhr.addEventListener('error' , () => {
console.log('请求失败')
})//请求被暂停会触发该监听器
}
const stop = () => {
xhr.abort()
}//停止请求的方法
FETCH
fetch默认只支持GET和POST请求方法
封装一个fetch
// GET请求
const sendFetch = () => {
fetch('http://localhost:3000/api/getData').then(async res => {
const response = res.clone();//原来的res已经被进度条占用了,新建一个response获取响应数据
//实现进度条
const reader = res.body.getReader()
const total = res.headers.get('Content-Length')
let loader = 0
while(true){
const {done, value} = await reader.read()
if(done){
break
}
loader += value.length
}
return res.json() //这里的res并不是响应对象,而是一个promise对象,所以需要使用then方法获取响应对象
//如果加入进度条那么就要
return response.json()
}).then(data => {
progress.innerText = `${(loader / total * 100).toFixed(2)}%` //设置进度条
console.log(data)//拿到响应数据
})
}
// POST请求
const sendFetch = () => {
fetch('http://localhost:3000/api/getData', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '张三',
age: 18
})//请求数据
}).then(res =>{
return res.json()
}).then(data => {
console.log(data)
})
}
写于西13