1.fetch 的概念和用法
fetch 提供了对 Request
和 Response
(以及其他与网络请求有关的)对象的通用定义。使之今后可以被使用到更多地应用场景中:无论是service workers、Cache API、又或者是其他处理请求和响应的方式,甚至是任何一种需要你自己在程序中生成响应的方式。
它还提供了一种定义,将 CORS 和 HTTP 原生的头信息结合起来,取代了原来那种分离的定义。
发送请求或者获取资源,需要使用 GlobalFetch.fetch
方法。它在很多接口中都被实现了,比如 Window
和 WorkerGlobalScope
。所以在各种环境中都可以用这个方法获取到资源。
fetch()
必须接受一个参数——资源的路径。无论请求成功与否,它都返回一个 promise 对象,resolve 对应请求的 Response
。你也可以传一个可选的第二个参数init
(参见 Request
)。
一旦 Response
被返回,就有一些方法可以使用了,比如定义内容或者处理方法(参见 Body
)。
你也可以通过 Request()
和 Response()
的构造函数直接创建请求和响应,但是我们不建议这么做。他们应该被用于创建其他 API 的结果(比如,service workers 中的 FetchEvent.respondWith
)。
2.语法
Promise<Response> fetch(input[, init]);
参数:
?input 定义要获取的指定资源,可以是字符串也可以是Request对象
const myRequest = new Request('http://localhost/flowers.jpg'); const myURL = myRequest.url; // http://localhost/flowers.jpg const myMethod = myRequest.method; // GET const myCred = myRequest.credentials; // omit
fetch(myRequest)
.then(response => response.blob())
.then(blob => {
myImage.src = URL.createObjectURL(blob);
});/pre>
init 可选一个配置项对象,包括所有对请求的设置。可选的参数有:
method
: 请求使用的方法,如GET、
POST、put/delete/option/...
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 , 必须提供这个选项, 从 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
: Specifies the value of the referer HTTP header. May be one ofno-referrer、
no-referrer-when-downgrade、
origin、
origin-when-cross-origin、
unsafe-url 。
integrity
: 包括请求的 subresource integrity 值 ( 例如:sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。
返回值:
一个 Promise
,resolve 时回传 Response
对象。
错误:
类型 | 描述 |
---|---|
AbortError |
The request was aborted (using AbortController.abort() ). |
TypeError |
Since Firefox 43, fetch() will throw a TypeError if the URL has credentials, such as http://user:password@example.com . |
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
下面是使用Promise 封装了Fetch 并返回promise 对象
const headers = new Headers({ 'Accept': 'application/json', 'Content-Type': 'application/json' }); function get (url) { return fetch(url, { method: 'GET', headers: headers }).then(response => { return handleResponse(url, response); }).catch(err => { console.error(`Request failed. Url = ${url} . Message = ${err}`); return {error: {message: 'Request failed.'}}; }) } function post (url, data) { return fetch(url, { method: 'POST', headers: headers, body: JSON.stringify(data) }).then(response => { return handleResponse(url, response); }).catch(err => { console.error(`Request failed. Url = ${url} . Message = ${err}`); return {error: {message: 'Request failed.'}}; }) } function put (url, data) { return fetch(url, { method: 'PUT', headers: headers, body: JSON.stringify(data) }).then(response => { return handleResponse(url, response); }).catch(err => { console.error(`Request failed. Url = ${url} . Message = ${err}`); return {error: {message: 'Request failed.'}}; }) } function handleResponse (url, response) { if (response.status < 500) { return response.json(); } else { console.error(`Request failed. Url = ${url} . Message = ${response.statusText}`); return {error: {message: 'Request failed due to server error '}}; } } export {get, post, put}