在使用JavaScript编写Web代码时,有许多Web API可供调用。其中Fetch API提供了一个获取资源的接口(包括跨域请求),用于访问和操作HTTP请求的一些具体部分,如请求头
Headers
、请求Request
、响应Response
和参数Body
。
# fetch API接口
# 基本概念
Fetch是一种HTTP数据请求的方式,是XMLHttpRequest的一种替代方案,是原生的js。可以在请求中的type查看到fetch请求的类型是fetch
,普通的ajax请求的类型是xhr
。
Fetch API 是基于Promise
的。核心在于对HTTP接口的抽象,包含 Request
(opens new window),Response
(opens new window),Headers
(opens new window),Body
(opens new window),以及用于初始化异步请求的 global fetch
(opens new window)。
global fetch
是位于 WorkerOrGlobalScope
(opens new window) 中的一个 mixin 的 fetch()
方法,返回一个promise实例,该promise会在请求响应后被resolve,并传回Response
对象。
window和WorkerGlobalScope都实现了WorkerOrGlobalScope,即window中存在fetch()方法,可以在任何地方调用fetch()方法。
从fetch()返回的Promise 不会被标记为reject
(即使响应的HTTP状态码是404或500),而是将Promise的状态变为resolve
,但返回的response中的ok
属性为false
。仅当网络故障时或请求被阻止时,才会标记为reject
。
# 基本语法
语法:fetch(input[,init])
参数:
- input:获取资源的URL,或是一个Request对象
- init:初始化参数(一个配置对象),可选参数有:
- method: 请求方式,GET, POST, PUT, DELETE, etc.
- headers:请求的头信息。可以指定参数类型
Content-Type
。 - body:请求参数。 需要与header中的 'Content-Type' 匹配。
- mode:请求的模式,如
cors、
no-cors 或者
same-origin。
- credentials: 请求的 credentials,如
omit、``same-origin 或者
include
。若需要当前域名内自动发送cookie,则必须提供该参数。 - cache:请求的cache模式,
default
、no-store
、reload
、no-cache
、force-cache
或者only-if-cached
。 - redirect:可用的 redirect 模式:
follow
(自动重定向),error
(如果产生重定向将自动终止并且抛出一个错误), 或者manual
(手动处理重定向). 在Chrome中默认使用follow(
Chrome 47之前的默认值是manual
) - referrer:
no-referrer、``client
或一个 URL。默认是client
。 - referrerPolicy: 指定了HTTP头部referer字段的值。可能为以下值之一:
no-referrer、
no-referrer-when-downgrade、
origin、
origin-when-cross-origin、
unsafe-url 。
- integrity:包括请求的 subresource integrity (opens new window) 值。
如果请求头Headers
中没有设置 Content-Type
值,发送的请求也会自动设值。因为request和response(包括 fetch()
方法)都会试着自动设置 Content-Type
。
Content-Type
的可选值:
text/html
:HTML文档标记image/jpeg
:JPEG图片标记image/gif
:GIF图片标记application/javascript
:js文档标记application/xml
:xml文件标记,如果是text/xml的话,将忽略xml数据里的编码格式multipart/form-data
:文件上传application/x-www-form-urlencoded
:普通表单
# 基本使用
一个基本的fetch
请求设置起来很简单,最简单的用法是只提供一个资源路径的URL,然后返回一个包含响应结果的promise
(一个Response
对象)。
fetch('http://localhost:8080/geoserver/wfs')
.then(function(response){
//handle HTTP response
return response.json();
})
.then(function(value){
//do something
});
2
3
4
5
6
7
8
Response (opens new window) 实例是在 fetch()
处理完 promise 之后返回的。其包含以下属性(只读):
Response.headers
:包含此 Response 所关联的Headers
(opens new window) 对象。Response.ok
:包含了一个布尔值,标示该 Response 成功Response.redirected
:表示该Response是否来自一个重定向,如果是的话,它的 URL 列表将会有多个条目。Response.status
:包含 Response 的状态码(HTTP 状态码的范围在 200-299)Response.statusText
:包含了与该 Response 状态码一致的状态信息(例如,OK对应200
)。Response.type
:包含Resposne的类型(例如:basic
、cors
)Repsonse.url
:包含 Response 的URL。Response.body
:一个简单的 getter,用于暴露一个ReadableStream
(opens new window) 类型的 body 内容。Response.bodyUsed
:包含了一个布尔值
(opens new window)来标示该 Response 是否读取过Body
(opens new window)。
不管是请求还是响应都能够包含 body
对象。而 Request (opens new window) 和Response (opens new window)也都实现了Body
类的一些方法以获取body的内容。例如:
Response.json()
:读取Response
(opens new window) 对象并且将它设置为已读,并返回一个被解析为JSON
(opens new window) 格式的 Promise 对象。Response.text()
:读取Response
(opens new window) 对象并且将它设置为已读,并返回一个被解析为USVString
(opens new window) 格式的 Promise 对象。Response.formData()
:读取Response
(opens new window) 对象并且将它设置为已读,并返回一个被解析为FormData
(opens new window) 格式的 Promise 对象。Response.blob()
:读取Response
(opens new window) 对象并且将它设置为已读,并返回一个被解析为Blob
(opens new window) 格式的 Promise 对象。Response.arrayBuffer()
:读取Response
(opens new window) 对象并且将它设置为已读,并返回一个被解析为ArrayBuffer
(opens new window) 格式的 Promise 对象。
因为 Responses 对象被设置为了 stream 的方式,所以它们只能被读取一次。
# 参考文章
[1] Fetch 接口 (opens new window) https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API
[2] Response (opens new window) https://developer.mozilla.org/zh-CN/docs/Web/API/Response