在 WEB 中,对于网络请求一直使用的是 XMLHttpRequest API 来处理,XMLHttpRequest 也很强大,传统的 Ajax 也是基于此 API 的。那么为何 W3C 标准中又加入了相似功能的 Fetch API 呢?他有何优点。编程
Fetch 提供了 Request 和 Response 对象的通用定义(以及与网络请求有关的其余内容)。这将容许 Fetch 在未来须要的任何地方使用,不管在 serviceWorker、Cache API以及处理或修改 Request 和 Response 的其余相似事物上,或者任何可能须要你以编程方式生成的 Response 的地方。json
它还提供了相关概念的定义,例如 CORS 和 HTTP 原始头语义,在其余地方取代它们的单独定义。数组
要发出请求并获取资源,请使用 WindowOrWorkerGlobalScope.fetch() 方法。这使得它几乎能够在你想要获取资源的任何上下文中使用。promise
Fetch API 是 W3C 正式规范中加入的新的用于网络请求相关的功能 API,核心就是对于 HTTP 接口的抽象,包含 Request / Response / Headers / Body,经过这些抽象出来的模块,对于 HTTP 相关的操做变得更简单方便。Fetch API 是异步化的接口,全部的结果都是 Promise 化的,一样在 window 环境和 seviceWorker 环境下都可访问。在 ServiceWorker 中,Fetch 被大量使用。浏览器
对于使用过 XMLHttpRequest 的人来讲,很容易上手。但 Fetch API 功能更强大和灵活。缓存
描述 Fetch 的接口,不是很单纯,它是以抽象出来的 HTTP 的那些模块来组合的。下面简单列一下,后面每一个模块详细说明。安全
fetchbash
位于 WindowOrWorkerGlobalScope 这一个 mixin 中的 fetch() 方法用于发起获取资源的请求。它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response 对象。服务器
Window 和 WorkerGlobalScope 下都可访问 fetch() 方法。cookie
fetch() 方法由 Content Security Policy 的 connect-src指令控制,而不是它请求的资源。
HTTP 404 状态并不被认为是网络错误。
语法
Promise<Response> fetch(input[, init]);
复制代码
fetch() 的构造器和 Request 的构造器彻底同样。
参数 resource
:支持如下两种类型:
USVString
:要获取资源的 URL 字符串。(有些浏览器也支持 blob:
和data:
类型的 URL)Request
对象。 (Request 这块在后面 Request 部分说)init
:可选。可设置任何须要应用到 Request 中的配置项。一般设置以下:
method
:请求的方法。如 POST
、GET
等。注意在 Fetch 请求方法为 GET 或 HEAD 下不能设置 Origin 头。(Firefox 65 已修正此问题 - 参考:Bug1508661)headers
:在 Headers 对象或具备 ByteString 值的对象中的任何你想添加的头。注意某此名称是被禁止的。body
:任何你想添加到 Request 中的 body,它能够是 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或者 HEAD 方法的 Request 没有 body。mode
:用于请求的模式。例如:cors
, no-cors
, 或者 same-origin
。credentials
:用于请求的受信类型,包括:omit
, same-origin
, 或者 include
。要自动发送当前域的cookie,必须提供此选项。从Chrome 50开始,此属性还会使用FederatedCredential实例或PasswordCredential实例。cache
:要用于请求的缓存模式。redirect
:要使用的重定向模式:follow
(自动跟随重定向),error
(若是发生重定向则停止错误),manual
(手动处理重定向)。Chrome 默认follow
(Chrome 47 之前默认 manual
)。referrer
:指定no-referrer
,client
或URL
的USVString
。默认为client
。referrerPolicy
:指定 referer HTTP 标头的值。 能够是 no-referrer
, no-referrer-when-downgrade
, origin
, origin-when-cross-origin
, unsafe-url
。integrity
:包含请求的子资源完整性值(例如:sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。keepalive
:keepalive
选项可用于容许请求比页面长。带keepalive
标志的 fetch 替代了navigator.sendboacon() API。signal
:AbortSignal实例。容许你与获取请求进行通讯,并在须要时经过AbortController停止它。返回值
Promise,resolve 时回传 Response 对象。
例外
类型 | 描述 |
---|---|
AbortError | 请求中断 (经过使用 AbortController.abort()) |
TypeError | 从Firefox 43开始,若是 URL 包含 credentials ,则 fetch() 将抛出 TypeError,例如 http:// user:password@example.com。 |
Fetch API 的 Request 接口表示资源请求。
你可使用 Request.Request()
构造函数建立新的 Request 对象,你也能够经过一个 API 操做返回 Request 对象,例如 serviceWorker 中的 FetchEvent.request。
建立新的 Request 对象。
语法
var myRequest = new Request(input[, init]);
复制代码
参数
input: 可用以下之一:
navigate
的 Request.mode,则mode
值将转换为same-origin
。init: 可选。同 fetch init。
default
, reload
, no-cache
。omit
, same-origin
, include
。默认same-origin
。sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=
。cors
, no-cors
, same-origin
, navigate
。follow
, error
, manual
。client
。no-referrer
。Request 实现 Body,因此 Body 的属性和方法在 Request 中依然有效。关于 Body,后面说。
Fetch API 的 Headers 接口容许你对 HTTP 请求和响应头执行各类操做。这些操做包括检索,设置,添加和删除。Headers 对象具备关联的标题列表,该列表最初为空,由零个或多个名称和值对组成。在此接口的全部方法中,标头名称由不区分大小写的字节序列匹配。
出于安全缘由,某些标头只能由浏览器控制。这些标头包括禁止的标头名称和禁止的响应标头名称。
一个Headers对象也有一个相关的“门”,取值为immutable
, request
, request-no-cors
, response
, none
。它会影响 set()
, delete()
, append()
是否会改变 header。
你也能够经过 Request.headers 和 Response.headers 属性取 Headers 对象。
建立一个 Header 对象。
语法:
var myHeaders = new Headers(init);
复制代码
参数:
append(name, value)
:将新值附加到 Headers 对象内的现有标头上,或者若是标头、不存在则添加标头。此方法用于一个属性对应多个值的添加方法。delete(name)
:方法从当前 Headers 对象中删除指定标头。entries()
:方法返回一个迭代器,容许遍历此对象中包含的全部键/值对。每对的键和值都是 ByteString 对象。forEach()
:为每一个数组元素执行一次提供的函数。get(name)
:方法返回具备给定名称的 Headers 对象中标头的全部值的字节字符串。若是 Headers 对象中不存在请求的标头,则返回 null。has(name)
:方法返回一个布尔值,代表Headers对象是否包含某个头。keys()
:方法返回一个迭代器,容许遍历此对象中包含的全部键。键是 ByteString 对象。set(name, value)
:方法为 Headers 对象内的现有标头设置新值,或者若是标头尚不存在则添加标头。(set 和 append 之间的区别在于,若是指定的头已经存在并接受多个值,则 set 将使用新值覆盖现有值,而 append将新值附加到值集的末尾)values()
:返回一个迭代器,容许遍历此对象中包含的全部值。值是 ByteString 对象。若是在 Header 中的方法中使用不在可用 HTTP 标头中的值,则会抛出 TypeError 错误。
表头根据上下文有以下几类:
认证类:
缓存类:
客户端提示类:
条件类:
链接管理类:
内容判断类:
控制类:
Cookie 类:
CORS 类:
不追踪类:
下载类:
消息正文类:
代理类:
重定向类:
请求上下文类:
响应上下文类:
范围请求类:
安全类:
服务器发送事件类:
转移编码类:
WebSockets 类:
其余:
Response 接口表示请求的响应。
Response()
语法:
var myResponse = new Response(body, init);
复制代码
参数:
body:(可选)
定义响应主体的对象。这能够是null,或者是:
init:(可选)
包含要应用于响应的任何自定义设置的选项对象。可选:
200
。OK
。Set-Cookie
和Set-Cookie2
外,全部标题都被暴露。Response.error()
获取的响应的类型。manual
进行的。 响应的状态为 0,标题为空,正文为空。Request 实现 Body,因此 Body 的属性和方法在 Request 中依然有效。关于 Body,后面说。
Body 表示响应 / 请求的主体,容许你声明其内容类型以及应如何处理它。
Body 由 Request 和 Response 实现。这为这些对象提供了关联的主体(流),使用过的标志(最初未设置)和MIME类型(最初是空字节序列)。
opaque
,则生成的 Blob 将具备 0 的 Blob.size 和空字符串“”
的 Blob.type,这使得它对 URL.createObjectURL 等方法无效。)formData()
以获取键值映射,修改某些字段,而后将表单向前发送到服务器)博客名称:王乐平博客
CSDN博客地址:blog.csdn.net/lecepin