Fetch API - 提供了一个用于获取资源的接口
Fetch API 提供了一个用于获取资源(包括跨网络)的接口。任何使用过 XMLHttpRequest
的人都会觉得很熟悉,但新的 API 提供了更强大、更灵活的功能集。
概念和用法
Fetch 为 Request
和 Response
对象(以及其他涉及网络请求的东西)提供了一个通用定义。这将允许它们在未来任何需要的地方被使用,无论是服务工作线程、缓存 API 和其他处理或修改请求和响应的类似事物,还是任何一种可能需要你以编程方式生成响应(即使用计算机程序或个人编程指令)的用例。
它还定义了相关概念,例如 CORS 和 HTTP Origin 标头语义,取代了它们在其他地方的单独定义。
要发出请求并获取资源,请使用 WindowOrWorkerGlobalScope.fetch()
方法。它在多个接口中实现,特别是 Window
和 WorkerGlobalScope
。这使得它几乎可以在您想要获取资源的任何上下文中使用。
fetch()
方法必须有一个参数,即您要获取的资源的路径。它返回一个 Promise
解析为该请求的 Response
— 只要服务器响应头 — 即使服务器响应是 HTTP 错误状态。您还可以选择传入一个 init
选项对象作为第二个参数(参见 Request
)。
检索到 Response
后,有许多方法可用于定义正文内容是什么以及应如何处理它(请参阅 Body
)。
您可以直接使用 Request()
和 Response()
构造函数创建请求和响应,但直接这样做的情况并不多见。相反,这些更有可能作为其他 API 操作的结果创建(例如,来自服务工作线程的 FetchEvent.respondWith()
)。
与 jQuery 的区别
fetch
规范与 jQuery.ajax()
主要有三个方面的不同:
- 从
fetch()
返回的 Promise 不会拒绝 HTTP 错误状态,即使响应是 HTTP404
或500
。相反,它将正常解析(ok
状态设置为false
),并且只会在网络故障或任何阻止请求完成的情况下才拒绝。 fetch()
不会发送跨域 cookies,除非你设置 credentials init 选项(为include
)。- 在 2018 年 4 月,规范将默认凭据策略更改为
'same-origin'
。因此以下浏览器的原生fetch
变成过时的,并在这些版本中更新了:Firefox 61.0b13、Safari 12、Chrome 68。 - 如果你的目标是这些浏览器的旧版本,请确保在所有可能受 cookie / 用户登录状态影响的 API 请求中加入
credentials: 'same-origin'
init 选项。
- 在 2018 年 4 月,规范将默认凭据策略更改为
备注
在使用 Fetch 中了解有关使用 Fetch API 功能的更多信息,并在 Fetch 基本概念中学习概念。
中止 fetch
浏览器已经开始为 AbortController
和 AbortSignal
接口(又称 Abort API)添加实验性支持,允许 Fetch 和 XHR 等操作在尚未完成时被中止。更多细节见接口页面。
Fetch 接口
WindowOrWorkerGlobalScope.fetch()
fetch()
方法用于获取资源。
Headers
表示响应 / 请求标头,允许您查询它们并根据结果采取不同的操作。
Request
表示一个资源请求。
Response
表示对请求的响应。
Fetch mixin
Body
提供与响应 / 请求正文相关的方法,允许您声明其内容类型是什么以及应该如何处理。
规范
规范 | 状态 | 备注 |
---|---|---|
Fetch | 现行的标准 | 初始定义 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 42 | 14 | 39 34 521 | 不支持 | 29 28 | 10.1 |
Support for blob: and data: | 48 | 79 | 未知 | 不支持 | 未知 | 未知 |
referrerPolicy | 52 | 79 | 52 | 不支持 | 39 | 11.1 |
signal | 66 | 16 | 57 | 不支持 | 53 | 11.1 |
Streaming response body | 43 | 14 | 支持 | 不支持 | 29 | 10.1 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 42 | 42 | 未知 | 39 34 521 | 未知 | 29 28 | 10.3 |
Support for blob: and data: | 43 | 48 | 未知 | 未知 | 未知 | 未知 | 未知 |
referrerPolicy | 52 | 52 | 未知 | 52 | 未知 | 41 | 不支持 |
signal | 66 | 66 | 未知 | 57 | 未知 | 47 | 11.3 |
Streaming response body | 43 | 43 | 未知 | 不支持 | 未知 | 不支持 | 10.3 |
1. fetch()
现在定义在 WindowOrWorkerGlobalScope
mixin 中。