JavaScript中的Fetch相关知识

147 阅读3分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

用法

fetch()方法是暴露在全局作用域中的,其中包括主页面执行线程、模块和工作线程。当调用这个方法时,浏览器就会向给定URL发送请求。fetch()只有一个必需的参数就是input,这个参数在多数情况下是要获取资源的URL。

let zss = fetch('/dir');
// Promise <pending>
console.log(zss);

当我们想要读取响应内容中纯文本格式的内容需要用到text()方法,这个方法会返回一个期约。可以解决取得资源的完整内容:

fetch('test.txt').then((res) => { console.log(res) });

fetch()处理状态码和请求失败可以通过response的status和statusText属性检查响应状态,当产生值为200时表示成功获取响应的请求。如果产生值为404表示请求资源不存在。如果产生值为500表示服务器抛出错误。在遇到重定向时的行为,默认行为是跟着重定向并返回状态码不是300399的响应。此时响应对象的redirected属性会被设置为true,而对应的状态码仍然为200;除了200之外,其他情况可以被认为失败。当只使用URL时,fetch会发送GET请求,只包含最低限度的请求头,发送配置还需要传入可选的第二个参数init对象,其中有cache用于控制浏览器与HTTP缓存的交互。body指定使用请求体时请求体的内容。keepalive用于指示浏览器允许请求存在时间超出页面生命周期。header用于指定请求头部。mode用于指定请求模式,这个模式决定来自跨源请求的响应是否有效。

// 第一个输出200,第二个输出ok
fetch('test.txt').then((response) => { console.log(response.status); console.log(response.statusText) })

fetch()既可以发送数据也可以接收数据。使用init对象参数。可以在配置fetch在请求体中发送各种序列化的数据,当发送json数据,需要在发送请求体中使用一种HTTP方法。在请求体中发送参数,因为请求体支持任意字符串值,所以可以通过它发送请求参数。也可以发送文件,因为请求体支持FormData实现,所以也可以序列化并发送文件字段中的文件。如果发送跨域请求,从不同的请求资源,响应要包含CORS头部才能保证浏览器收到响应。如果没有头部,跨源请求会失败并且抛出错误。

Fetch API支持通过AbortController/AbortSignal对中断请求,当我们调用AbortController.abort()会中断所有网络传输,中断进行中的fetch()请求会导致包含错误的拒绝。

// 设置15毫秒后中断请求
setTimeout(() => abortController.abort(), 15)

Request和Response

Request对象是获取资源请求的接口, 通过构造函数初始化Request对象。所以我们需要传入一个input参数,一般是URL,也可以接收第二个参数是一个init对象。可以使用clone()方法来克隆一个一模一样的副本。Response对象是获取资源响应的接,通过构造函数初始化Response对象且不需要参数,响应的实例的属性均为默认值。也可以接收一个body参数,这个参数可以为null,也可以接收一个可选的init对象,可以包括headersstatusstatusText