使用 Fetch
Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。它还提供了一个全局 fetch() 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。
这种功能以前是使用 XMLHttpRequest 的升级版。Fetch 提供了一个更理想的替代方案,可以很容易地被其他技术使用 ......参考 MDN Fetch API 部分......
基本的 fetch 请求设置
通过网络获取一个 JSON 文件并将其打印到控制台
fetch('http://example.com/movies.json')
.then(response => response.json())
.then(data => console.log(data));
-
response.text():得到文本字符串。
-
response.json():得到 JSON 对象。
-
response.blob():得到二进制 Blob 对象。
-
response.formData():得到 FormData 表单对象。
-
response.arrayBuffer():得到二进制 ArrayBuffer 对象。
支持的请求参数
fetch() 接受第二个可选参数,一个可以控制不同配置的 init 对象:
// Example POST method implementation:
async function postData(url = '', data = {}) {
// Default options are marked with *
const response = await fetch(url, {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
mode: 'cors', // no-cors, *cors, same-origin
cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
credentials: 'same-origin', // include, *same-origin, omit
headers: {
'Content-Type': 'application/json'
// 'Content-Type': 'application/x-www-form-urlencoded',
},
redirect: 'follow', // manual, *follow, error
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
body: JSON.stringify(data) // body data type must match "Content-Type" header
});
return response.json(); // parses JSON response into native JavaScript objects
}
postData('404 - Not Found', { answer: 42 })
.then(data => {
console.log(data); // JSON data parsed by `data.json()` call
});
检测请求是否成功
如果遇到网络故障或服务端的 CORS 配置错误时,fetch() promise 将会 reject,带上一个 TypeError 对象。虽然这个情况经常是遇到了权限问题或类似问题——比如 404 不是一个网络故障。想要精确的判断 fetch() 是否成功,需要包含 promise resolved 的情况,此时再判断 Response.ok 是否为 true。类似以下代码:
fetch('flowers.jpg')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not OK');
}
return response.blob();
})
.then(myBlob => {
myImage.src = URL.createObjectURL(myBlob);
})
.catch(error => {
console.error('There has been a problem with your fetch operation:', error);
});
如上所述,Response 实例是在 fetch() 处理完 promise 之后返回的。
Response.status (默认值为 200)为response的状态码。
Response.statusText 字符串(默认值为 ""),该值与 HTTP 状态码消息对应。 注意:HTTP/2 不支持状态消息
Response.ok 如上所示,该属性是来检查 response 的状态是否在 200 - 299(包括200 和 299)这个范围内。该属性返回一个布尔值。
尊重语义使用 await 改写
- await 必须放到函数里
- 函数必须有 async 修饰符
async function getJSON() {
let url = 'https://api.com/json';
try {
let response = await fetch(url);
return await response.json();
} catch (error) {
console.log('Request Failed', error);
}
}
const function = async () => {
let response = await fetch('https://api.com/text');
if (response.ok) {
var data = await response.text();
console.log(data);
} else {
throw new Error(response.statusText);
}
}
网友评论