- 作者:老汪软件技巧
- 发表时间:2024-08-18 21:03
- 浏览量:
http request-01-XMLHttpRequest XHR 简单介绍
http request-01-XMLHttpRequest XHR 标准
Ajax 详解-01-AJAX(Asynchronous JavaScript and XML)入门介绍
Ajax XHR 的替代方案-fetch
Ajax XHR 的替代方案-fetch 标准
Ajax 的替代方案-axios.js
http 请求-04-promise 对象 + async/await
fetch
跨网络异步获取资源的功能以前是使用XMLHttpRequest对象实现的,Fetch API提供了更好的替代方案,可以很容易的被其他技术使用(如Servise Workers)
fetch,说白了,就是XMLHttpRequest的一种替代方案。
如果有人问你,除了Ajax获取后台数据之外,还有没有其他的替代方案?
你就可以回答,除了XMLHttpRequest对象来获取后台的数据之外,还可以使用一种更优的解决方案fetch。
fetch的支持性还不是很好,但是在谷歌浏览器中已经支持了fetch
返回 promise
Fetch API提供了一个全局的fetch()方法,该方法会返回一个Promise
当fetch请求接收到一个代表错误的状态码时(如404、500),返回的Promise不会被标记为reject,而是被标记为resolve,但是会将response的ok属性设置为false。
只有当网络错误或请求被阻止时才会被标记为reject状态
fetch('https://127.0.0.1/125.jpg').then(function(res){
if(res.ok) {
return res.blob();
}else {
console.log('服务器响应出错了'); // 资源404、服务器500等
}
}).catch(function(err){
console.log('Network response was not ok.'); // 网络出错
})
为什么需要 js fetch,解决了 ajax 的什么问题?
fetch API 是为了解决传统的 XMLHttpRequest (XHR) 在使用过程中存在的一些问题和局限性。
fetch 提供了一个更现代化和简洁的方式来进行网络请求。
以下是 fetch 解决的一些 AJAX 的问题:
1. 更简洁的 API 设计
设置请求方法、URL、请求头、监听状态变化等都需要多个步骤。
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
} else if (xhr.readyState === 4) {
console.error('Request failed');
}
};
xhr.send();
2. 基于 Promise 的设计3. 更好的流媒体支持4. 内置的 JSON 处理5. 默认行为更直观6. 更好的错误处理总结
fetch 通过更简洁的 API、原生的 Promise 支持、内置的 JSON 处理、更好的流媒体支持,以及更直观的默认行为,解决了 XMLHttpRequest 在使���上的诸多不便,适合现代 JavaScript 开发需求。
fetch() 方法的两个参数
fetch()方法接收两个参数:第一个参数表示要获取的资源路径;第二个参数表示请求的配置项(可选)
fetch('https://127.0.0.1/api/articles/1/3').then(function(res){
if(res.ok) {
return res.json();
}
})
// 定义第二个参数
fetch('https://127.0.0.1/api/articles/1/3', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
token:'token'
},
cache: 'default',
mode: 'cors',
}).then(function(res){
if(res.ok) {
return res.json();
}
})
设置请求的头信息
在POST提交的过程中,一般是表单提交,可是,经过查询,发现默认的提交方式是:
Content-Type:text/plain;charset=UTF-8,这个显然是不合理的,改为 application/x-www-form-urlencoded
fetch('https://www.baidu.com/search/error.html', {
method: 'POST',
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式为表单提交
}),
body: new URLSearchParams([["foo", 1],["bar", 2]]).toString()
})
.then((res)=>{
return res.text()
})
.then((res)=>{
console.log(res)
})
默认不使用 cookie
默认情况下, fetch 不会从服务端发送或接收任何 cookies,要发送 cookies,必须设置 credentials 选项
fetch('http://127.0.0.1/search/name', {
method: 'GET',
credentials: 'include' // 强制加入凭据头
})
.then((res)=>{
return res.text()
})
GET请求及传参
GET请求中如果需要传递参数怎么办?
这个时候,只能把参数写在URL上来进行传递了。
fetch('http://127.0.0.1/search?a=1&b=2', { // 在URL中写上传递的参数
method: 'GET'
})
.then((res)=>{
return res.text()
})
POST 请求及传参
POST请求的参数,放在第二个参数的body属性中
fetch('http://127.0.0.1/searchs', {
method: 'POST',
body: new URLSearchParams([["foo", 1],["bar", 2]]).toString() // 这里是请求对象
})
.then((res)=>{
return res.text()
})
POST提交改为application/x-www-form-urlencoded
fetch('http://127.0.0.1/searchs', {
method: 'POST',
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式为表单提交
}),
body: new URLSearchParams([["foo", 1],["bar", 2]]).toString() // 这里是请求对象
})
.then((res)=>{
return res.text()
})
fetch 的使用场景,有哪些优缺点?使用场景
fetch API 在以下场景中非常适用: