区别:
Axios是对底层网络请求API的一层封装;
fetch是对xhr的一个替代;
js只能使用XMLHttpRequest或者fetch发起网络请求
xhr实际与xml没有任何联系
利用xhr发送一个请求
let xhr = new XMLHttpRequest()
xhr.open('GET', '/xhr.json')
xhr.onreadystatechange = function(e) {
if(xhr.readyState ===4) {
console.log('response', xhr.response)
}
}
xhr.send()
利用fetch发送一个请求
fetch('./fetch.json', {
method: 'GET',
headers:{
'a': 1,
}
}).then(res => {
console.log('res', res)
return res.json()
}).then(data => {
console.log(data)
}).catch(e => {
console.log('error', e)
})
在xhr实例生成之后调用xhr.open()
方法就可以把网络请求的请求方法和请求的目标地址给设置
三行代码发送一个请求
// 发送请求
const xhr = new XMLHttpRequest()
xhr.open('GET', '/xhr.json')
xhr.send()
// 处理数据
xhr.onreadystatechange = function(e) {
if(xhr.readyState === 4) {
const data = xhr.response
}
}
语法
xhr.open(method, url)
xhr.open(method, url, async)
xhr.open(method, url, async, user)
xhr.open(method, url, async, user, password)
`method`
要使用的HTTP方法,GET、POST、PUT、DELETE、等,对于非HTTP(s) URL被忽略
url
一个DOMString
表示要向其发送请求的URL。
async
一个可选的布尔参数,表示是否异步执行操作,默认为true
。如果为false
,send()
方法直到收到答复前不会返回。如果true
,已完成事务的通知可供事件监听器使用。如果multipart
属性为true则这个必须为true
,否则将引发异常
xhr.send()
是用来发送请求体的(get请求是不会发送请求体的,即使在xhr.send()中添加了参数)
语法
XMLHttpRequest.send(body)
body
在XHR请求中要发送的数据体可以是:
- 可以为Document,在这种情况下,它在发送之前被序列化;
- 为XMLHttpRequestBodyInit,从per the Fetch spec可以是Blob、BufferSorce、FormData、URLSearchParams或者USVString对象
- null(body中没有指定值,则默认值为null)
xhr.send()会根据参数自动设置content-type类型
这是一个处理xhr状态变更的监听函数,xhr总共有5中状态
0 — ‘UNSENT’: xhr被创建,但没有调用open()方法
1 — ‘OPENED’: open()方法已经被调用
2 — ‘HEADERS_RECEIVED’: send()方法已经被调用,并且头部和状态已经可获得
3 — ‘LOADING’: 下载中,responseText属性已经包含部分数据
4 — ‘DONE’: 下载操作已完成
设置http请求的头信息
获取服务器返回的http头信息
取消xhr请求,请求取消后可以看到取消记录
都是和处理返回内容有关
设置超时时间
xhr.ontimeout
设置超时函数
xhr.timeout = 2000 xhr.ontimeout = function () { console.log('超时啦') }
检测下载进度,通过loaded
和total
来计算下载进度
xhr.onprogress = function (e) {
console.log('onprogress', e)
console.log('进度', `${Math.floor(e.loaded / e.total * 100)} %`)
}
loaded:
已经下载的大小
total:
总的大小
const xhr = new XMLHttpRequest()
xhr.open('POST', 'https://api.x.com.setUInfo')
xhr.withCredentials = true
xhr.responseType = 'json'
xhr.setRequestHeader('content-type', 'application/json')
xhr.onreadystatechange = function(e) {
if(xhr.readyState === 4) {
console.log('status', xhr.status)
console.log('statusText', xhr.statusText)
console.log('content-type', xhr.getResponseHeader('content-type'))
const data = xhr.response
// 业务逻辑
}
}
xhr.onprogress = function (e) {
console.log('onprogress', e)
// console.log('进度', `${Math.floor(e.loaded / e.total * 100)} %`)
}
xhr.timeout = 2000
xhr.ontimeout = function () {
console.log('请求超时')
}
xhr.onabort = function () {
console.log('取消请求')
}
xhr.send(JSON.stringify({
name: 'yunu',
age: 10086
}))
使用fetch发起一个网络请求是非常简单的
async function getData() {
const res = await fetch('./fetch.json')
console.log('res', res)
const data = await res.json()
console.log('data', data)
}
getData()
fetch有两个参数位,第一个参数一般是一个字符串,就是目标地址url,第二个参数是一个对象,用来添加对请求的各种配置
async function getData() {
const res = await fetch('http://xxxx.xx/xx', {
method: 'POST',
credentials: 'same-origin',
mode: 'cors',
headers: {
'content-type': 'application/json',
a: 1
},
body: JSON.stringify({
name: 'xxx',
age: 10086
})
})
console.log('res', res)
const data = await res.json()
console.log('data', data)
}
getData()
也可以创建request实例作为fetch的参数
async function getData3() {
const myRequest = new Request('./api/xxx', {
method: 'GET'.
credentials: 'omit',
headers: {
'content-type': 'application/json',
a: 1
}
})
const res = await fetch(myRequest)
console.log('res3', res)
const data = await res.json()
console.log('data3', data)
}
http请求的 请求方法(GET POST HEAD PUT DELETE OPTIONS CONNECT TRACE), 可大写 可小写 可大小写,写错会返回错误
可以给headers传递一个对象,请求发起的时候会把该对象合并到HTTP的请求头里面去,重复的key会被最后出现的key覆盖掉
body
是用来添加请求体的,和xhr.send()
相似
是一个枚举值,可以是以下的值
在跨域请求的时候决定是否发送cookie等信息,只有true或false两个参数
和取消跨域请求相关的属性,请求取消后会抛出一个promise reject
想要获取请求头信息可以通过response.headers.get()来获取
获取返回的内容