回顾一下XMLHttpRequest的问题
Fetch Api的特点
该函数有两个参数:
//请求数据的函数如下
const getDefaultData = () => {
//在论坛中我找到了一个请求网易云音乐别人已经写好的接口,可以用来测试
const url = 'https://api.imjad.cn/cloudmusic/?type=song&id=32785674';
fetch(url);
}
// 假设我们的html页面中有一个按钮, 点击这个按钮就会开始请求数据,然后我们现在获取到这个按钮
const btn = document.querySelector('button');
btn.onclick = () => {
getDefaultData();
}
当上面的代码写好, 我们进行点击操作时, 服务器相应的给我们返回了数据
请求配置对象(红色为比较常用的, 绿色为目前不太常用的)
//配置对象书写
const getData = function() {
const url = 'xxx/api';
const config = {
method: 'POST', // 写请求方法
headers: {
// 配置请求头
//例如: "Content-Type": 'application/json'
},
body: {
// 配置请求体, 比如POST请求要传递的数据
}
//...其他不常用配置
}
fetch(url, config); // 开始请求数据
}
fetch函数返回一个Promise对象
const getDefaultData = async () => {
const url = 'https://api.imjad.cn/cloudmusic/?type=song&id=32785674';
const config = {
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
body: {
},
// mode: 'cors'
}
// 既然返回的结果是一个Promise, 那么我们就可以用await等待服务器响应的结果
try {
let promise = await fetch(url);
console.log(promise);
}catch(err) {
console.log(err);
}
}
const btn = document.querySelector('button');
//当按钮点击的时候我们开始数据请求
btn.onclick = function () {
getDefaultData();
}
Response对象(服务器响应对象)
const result = await fetch(url, config);
const respText = await result.text();
const result = await fetch(url, config);
const respBlob = await result.blob();
const result = await fetch(url, config);
const respJson = await result.json();
除了使用基本的fetch方法, 还可以通过创建一个request对象来完成请求, 实际上fetch的内部也会帮你创建一个内部对象
//request对象的创建方式
new Request(url, config)
当我们遇到要复用某些请求的需求时, 就可以用到request对象
function getRespInfo() {
const url = 'xxx/api';
const config = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
}
//...body和其他配置
const request = new Request(url, config);
}
}
function async getData() {
// 每次都走一次getRespInfo这个函数, 保证每次创建的都是一个新的request对象
const result = await fetch(getRespInfo());
const respText = await result.text();
}
注意点: 尽量保证每次请求都是一个新的request对象
大多数时候, Response对象都不需要我们自己来构建, 因为服务器会帮我们封装好, 但是在某些特殊时候, 比如后端数据还没写好, 在这种情况下,我们可能最先想到的就是mock数据, 但是我们也可以手动构建一个Response, 用来帮我们构建测试环境
// 我们有一个用来获取省市的函数
async function getProvince() {
// 手动构建的Response对象
const resp = new Response(
`[
{"id": 1, "name": "beijing"},
{"id": 2, "name": "shanghai"}
]`,
ok: true,
status: 200
)
const result = await getJSON(resp);
console.log(result);
}
async function getJSON(resp) {
return await resp.json();
}
但是因为我们大部分时间其实不会这样进行测试, 所以仅了解即可
在Request和Response对象内部, 会将传递配置中的headers请求头对象转化为Headers对象
同时Headers对象提供一些方法:
const url = 'xxx/api';
const config = {
headers: {
'Content-Type': 'application/json'
}
}
const resp = new Request(url, config);
console.log(resp.headers.has('Content-Type')); //返回true, 因为我们请求头中配置了
const url = 'xxx/api';
const config = {
headers: {
'Content-Type': 'application/json'
}
}
const resp = new Request(url, config);
console.log(resp.headers.get('Content-Type')); //返回'application/json'
// 其余代码跟上面两个方法一样
resp.headers.set(c, 'helloworld'); //这时候请求头中会多出一个c 并且值为'helloworld'
//其余代码跟上面三个方法一样
resp.headers.append(d, 'its tom'); //网请求头中添加一个d, 值为'its tom'
需要注意的是, 如果是对重复的属性用append,并不会覆盖之前的属性而是合并
// 假设headers中有a 值为1,然后我们调用append
resp.headers.append(a, 3); // 这时候headers中a的值为1,2
const url = 'xxx/api';
const config = {
headers: {
'Content-Type': 'application/json',
'a': 1
}
}
const resp = new Request(url, config);
console.log(resp.headers.keys());
const url = 'xxx/api';
const config = {
headers: {
'Content-Type': 'application/json',
'a': 1
}
}
const resp = new Request(url, config);
console.log(resp.headers.values());
const url = 'xxx/api';
const config = {
headers: {
'Content-Type': 'application/json',
'a': 1
}
}
const resp = new Request(url, config);
console.log(resp.headers.entries());