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 请求头:
Accept
Accept-Language
Content-Language
Content-Type
允许使用的值为:application/x-www-form-urlencoded
、multipart/form-data
或text/plain