1 概念
Fetch 基于 Primise 提供了获取资源的功能(包括跨域请求),与 XMLHttpRequest 的很多功能相似,但使用更方便,且更具有可扩展性和高效性。
Fetch 的核心在于为 Request、Response、Body、CORS、HTTP 等提供了一种通用的定义方法,取代了它们之前分离的定义方式。
2 Fetch 与 jquery.ajax 的不同
当接收到错误的 HTTP 状态码时,从 Fetch 返回的 Promise 会被标记为 resolve (但会将 resolve 返回值的 ok 属性设置为 false),当且仅当网络故障或请求被终止时,才会才会被标记为 reject。
默认 Fetch 不会给服务器发送或接收服务器的 cookie,除非设置 credentials 选项。(自 2017 年 8 月 25 日以后,默认的 credentials 政策变更为
same-origin
。Firefox 也在 61.0b13 版本中进行了修改)
3 语法
1 | Promise<Response> fetch(input[, init]); |
3.1 参数
?input
定义要获取的资源。这可能是:
init 可选
一个配置项对象,包括所有对请求的设置。可选的参数有:
method
: 请求使用的方法,如GET
、POST
。headers
: 请求的头信息,形式为Headers
的对象或包含ByteString
值的对象字面量。body
: 请求的 body 信息:可能是一个Blob
、BufferSource
、FormData
、URLSearchParams
或者USVString
对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。mode
: 请求的模式,如cors、
no-cors 或者
same-origin。
credentials
: 请求的 credentials,如omit、same-origin 或者 include。为了在当前域名内自动发送 cookie , 必须设置该选项为 same-origin, 从 Chrome 50 开始, 这个属性也可以接受
FederatedCredential
实例或是一个PasswordCredential
实例。cache
: 请求的 cache 模式:default
、no-store 、
reload 、
no-cache 、
force-cache
或者only-if-cached 。
redirect
: 可用的 redirect 模式:follow
(自动重定向),error
(如果产生重定向将自动终止并且抛出一个错误), 或者manual
(手动处理重定向). 在Chrome中,Chrome 47之前的默认值是 follow,从 Chrome 47开始是 manual。referrer
: 一个USVString
可以是no-referrer、``client
或一个 URL。默认是client。
referrerPolicy
: 指定了HTTP头部referer字段的值。可能为以下值之一:no-referrer、
no-referrer-when-downgrade、
origin、
origin-when-cross-origin、
unsafe-url 。
integrity
: 包括请求的 subresource integrity 值 ( 例如:sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。
3.2 返回值
一个 Promise
,resolve 时会传 Response
对象。
4 示例
4.1 判断请求是否成功
当response.ok 为 true 时,请求才成功
1 | fetch('flowers.jpg').then(function(response) { |
4.2 发送带凭证的请求
通过 credentials 选项配置凭证
1 | fetch('https://example.com', { |
4.3 上传 JSON 数据
1 | var url = 'https://example.com/profile'; |
4.4 上传文件
可以通过 HTML <input type="file" />
元素,FormData()
和 fetch()
上传文件。
1 | var formData = new FormData(); |
4.5 上传多个文件
可以通过HTML <input type="file" mutiple/>
元素,FormData()
和 fetch()
上传文件。
1 | var formData = new FormData(); |
4.6 自定义请求对象
除了传给 fetch()
一个资源的地址,你还可以通过使用 Request()
构造函数来创建一个 request 对象,然后再作为参数传给 fetch()
:
1 | var myHeaders = new Headers(); |
Request()
和 fetch()
接受同样的参数。你甚至可以传入一个已存在的 request 对象来创造一个拷贝:
1 | var anotherRequest = new Request(myRequest,myInit); |
这个很有用,因为 request 和 response bodies 只能被使用一次(这里的意思是因为设计成了 stream 的方式,所以它们只能被读取一次)。创建一个拷贝就可以再次使用 request/response 了,当然也可以使用不同的 init
参数。
注意:clone()
方法也可以用于创建一个拷贝。它和上述方法一样,如果 request 或 response 的 body 已经被读取过,那么 clone 将执行失败。区别在于, clone()
出的 body 被读取不会导致原 body 被标记为已读取。
1 |