xhr封装axios

xhr封装axios

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 实现
function axios(method, url, data={}, params={}) {
return new Promise((resolve, reject) => {
// 1.方法转大写
method = method.toUpperCase()

// 2.将 query 参数拼接到 url 上
let queryString = ""
Object.keys(params).forEach(key => {
queryString += `${key}=${params[key]}& `
})

// 判断 queryString 中有没有值
if (queryString) {
// 去除最后的 &
queryString = queryString.substring(0, queryString.length - 1)
// 接到 url 上
url += '?' + queryString
}

// 3.xhr 发请求
let xhr = new XMLHttpRequest()
xhr.open(method, url)
if (method === 'GET') {
xhr.send()
} else if (method === 'POST') {
xhr.setRequestHeader(
"Content-Type",
"application/json;charset=utf-8"
)
xhr.send(JSON.stringify(data))
}
xhr.onreadystatechange = function () {
const { status, statusText } = xhr
if (xhr.readyState !== 4) return
if (status >= 200 && status < 300) {
// 准备结果数据对象 response
const response = {
data: JSON.parse(request.response),
status,
statusText
}
resolve(response)
} else {
reject(new Error("request error status is " + status))
}
}
}
}

// 调用
function testPost() {
axios({
url: "http://localhost:3000/posts",
method: "POST",
data: {
title: "",
author: "",
id: 4
}
}).then(
response => {
console.log(response);
},
error => {
console.log(error.message);
}
);
}

xhr封装axios
http://example.com/2022/11/24/xhr封装axios/
Author
John Doe
Posted on
November 24, 2022
Licensed under