Fetch
Fetch API 提供了一个获取资源的接口(包括跨域请求)。
概念和用法
Fetch 提供了对 Request 和 Response (以及其他与网络请求有关的)对象的通用定义。
fetch() 必须接受一个参数——资源的路径。无论请求成功与否,它都返回一个 Promise 对象,resolve 对应请求的 Response。你也可以传一个可选的第二个参数 init。
一旦 Response 被返回,就可以使用一些方法来定义内容的形式,以及应当如何处理内容。
使用 Fetch
Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应。
这种功能以前是使用 XMLHttpRequest 实现的。Fetch 提供了一个更理想的替代方案,可以很容易地被其他技术使用,例如 Service Workers。
Fetch 还提供了专门的逻辑空间来定义其他与 HTTP 相关的概念,例如 CORS 和 HTTP 的扩展。
fetch 规范与 jQuery.ajax() 主要有以下的不同:
- 当接收到一个代表错误的 HTTP 状态码时,从
fetch()返回的 Promise 不会被标记为 reject,即使响应的 HTTP 状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (如果响应的 HTTP 状态码不在 200 - 299 的范围内,则设置 resolve 返回值的ok属性为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。 fetch不会发送跨域 cookies,除非你使用了 credentials 的初始化选项。(自2018 年 8 月以后,默认的 credentials 政策变更为same-origin。Firefox 也在 61.0b13 版本中进行了修改)
一个基本的 fetch 请求设置起来很简单。
1 | fetch('http://example.com/movies.json') |
当然它只是一个 HTTP 响应,而不是真的 JSON。为了获取JSON的内容,我们需要使用 json() 方法(该方法返回一个将响应 body 解析成 JSON 的 promise)。
支持的请求参数
1 | // Example POST method implementation: |
注意:mode: "no-cors" 仅允许使用一组有限的 HTTP 请求头:
AcceptAccept-LanguageContent-LanguageContent-Type允许使用的值为:application/x-www-form-urlencoded、multipart/form-data或text/plain