fetch:不一样的xhr要求

fetch初识

此功用某些浏览器尚在开辟中,请参考浏览器兼容性表格以取得在差别浏览器中合适运用的前缀。由于该功用对应的规范文档可以被从新订正,所以在将来版本的浏览器中该功用的语法和行动可以随之转变。

Note: 假如不须要支撑落伍的IE系列浏览器,就可以宁神大胆的运用吧!
ps: 固然也可以运用第三方的polyfill 库!https://github.com/github/fetch

fetch供应了关于xhr的这类要求中的罕见的【要求 Request】、【相应 Response】两个对象的定义,就像node提议一个要求或许相应一个要求一样,建立了request、response两个实例对象,供运用者猎取全部要求过程当中的要乞降相应信息。

它还供应了一种定义,将 CORS 和 HTTP 原生的头信息结合起来,庖代了本来那种星散的定义。

fetch() 必需吸收一个参数——资本的途径。不管要求胜利与否,它都返回一个 promise 对象,resolve 对应要求的 Response。你也可以传一个可选的第二个参数—— init(参考 Request)。

一旦 Response 被返回,就有一些要领可以运用了,比方定义内容或许处置惩罚要领(参考 Body)。

你也可以经由过程 Request() 和 Response() 的组织函数直接建立要乞降相应,然则我们不发起这么做。他们应该被用于建立其他 API 的效果(比方,service workers 中的 FetchEvent.respondWith)。

fetch由来

参考:https://developer.mozilla.org…
https://developer.mozilla.org…
https://developer.mozilla.org…
在这里可以须要先说下fetch要领的定义,其最原始的定义是在一个接口叫做GlobalFetch,该接口包括了GlobalFetch.fetch() 要领,Window 和WorkerGlobalScope都完成了GlobalFetch 接口,厥后浏览器都把这个接口作了修正,形成了新的mixin,也就是WorkerOrGlobalScope,继而演变为:WindowOrWorkerGlobalScope,WindowOrWorkerGlobalScope混入【mixin】 了对 Window 和WorkerGlobalScope 接口的大众特征的形貌【包括罕见的setInterval、setTimeout等】。明显除了下文行将列出的以外,这些接口中的每个,都可以增添更多的特征。

GlobalFetch =》 WorkerOrGlobalScope =》WindowOrWorkerGlobalScope

Note: WindowOrWorkerGlobalScope 是一个 mixin 而并不是 interface。不能建立一个范例为 WindowOrWorkerGlobalScope 的对象。

由于 Window 和WorkerGlobalScope都完成了上述mixin,故而可以宁神的在全局域下运用fetch,

fetch观点

Fetch 是一个当代的观点, 等同于 XMLHttpRequest。它供应了许多与XMLHttpRequest雷同的功用,但被设想成更具可扩展性和高效性。
Fetch 的中心在于对 HTTP 接口的笼统,包括 Request,Response,Headers,Body,以及用于初始化异步要求的 global fetch。得益于 JavaScript 完成的这些笼统好的 HTTP 模块,其他接口可以很轻易的运用这些功用。

Service Workers 是一个应用了 Fetch 完成的接口的例子。

除此以外,Fetch 还应用到了要求的异步特征——它是基于 Promise 的。

fettch运用

参考:https://developer.mozilla.org…
https://developer.mozilla.org…
这里先给出一个很简朴的例子,以上代码中,我们经由过程收集猎取了一个图片,然后将它插进去到一个 <img> 标签中。这个最简朴的用法中,fetch() 吸收了一个参数——要求的地点——然后返回一个包括 response(一个 Response 对象)的 promise 对象。:

var myImage = document.querySelector('img');

fetch('flowers.jpg')
.then(function(response) {
  return response.blob();
})
.then(function(myBlob) {
  var objectURL = URL.createObjectURL(myBlob);
  myImage.src = objectURL;
});

这个例子很简朴,不过照样须要先推断下是不是支撑fetch:

if(self.fetch) {
    // run my fetch request here
} else {
    // do something with XMLHttpRequest?
}

上面简朴的例子已包括了response对象、blob要领、then要领;背面逐一简述;上面的例子中,fetch函数只是运用了一个参数,也就是url,即猎取数据的后段地点,实在另有第二个参数 init对象;

var myHeaders = new Headers();

var myInit = { method: 'GET',
               headers: myHeaders,
               mode: 'cors',
               cache: 'default' };

fetch('flowers.jpg',myInit)
.then(function(response) {
  return response.blob();
})
.then(function(myBlob) {
  var objectURL = URL.createObjectURL(myBlob);
  myImage.src = objectURL;
});

经由进一步的完美,fetch运用变成了这个模样。实际上fetch的定义是如许的:

Promise<Response> fetch(input[, init]);
//another to write the args of fetch 另一种誊写体式格局
var myRequest = new Request(input, init);
Promise<Response> fetch(myRequest);

参数

参数的详细引见:

参数
input
定义要猎取的资本。这多是:
一个 USVString 字符串,包括要猎取资本的 URL。一些浏览器会吸收 blob: 和 data: 作为 schemes.
一个 Request 对象。
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 , 必需供应这个选项, 从 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 of no-referrer、 no-referrer-when-downgrade、 origin、 origin-when-cross-origin、 unsafe-url 。
integrity: 包括要求的  subresource integrity 值 ( 比方: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=)。
返回值
一个 Promise,resolve 时回传 Response 对象。

Exceptions
Type    Description
TypeError    Since Firefox 43, fetch() will throw a TypeError if the URL has credentials, such as http://user:password@example.com.

以上可以看到的就是一切的参数,一样也是有两种情势的誊写:

myHeaders = new Headers({
  "Content-Type": "text/plain",
  "Content-Length": content.length.toString(),
  "X-Custom-Header": "ProcessThisImmediately",
});
//它的内容可以被猎取:
console.log(myHeaders.has("Content-Type")); // true
console.log(myHeaders.has("Set-Cookie")); // false
myHeaders.set("Content-Type", "text/html");
myHeaders.append("X-Custom-Header", "AnotherValue"); //http 头部信息
var myInit = { method: 'GET',
               headers: myHeaders,
               mode: 'cors',
               cache: 'default' };

fetch('flowers.jpg',myInit)
.then(function(response) {......
//或许运用这个来构建fetch参数,所需的参数和fetch所需的参数一样
var anotherRequest = new Request(input,myInit);

个中的头部有些须要注重,概况检察:https://developer.mozilla.org… 可以直接运用Headers构建新的要求头,headers是由键值对组成,不过有的要求头只允许用户代办做修正,概况拜见:https://developer.mozilla.org…
同时Guard也是Headers中的重要部份,由于 Headers 可以在 request 要求中被发送或许在 response 要求中被吸收,而且划定了哪些参数是可写的,Headers 对象有一个特别的 guard 属性。这个属性没有暴露给 Web,然则它影响到哪些内容可以在 Headers 对象中被操纵。

可以的值以下:

  • none:默许的

  • request:从 request 中取得的 headers(Request.headers)只读【后端猎取http要求对象】

  • request-no-cors:从差别域(Request.mode no-cors)的 request 中取得的 headers 只读

  • response:从 response 中取得的 headers(Response.headers)只读

  • immutable:在 ServiceWorkers 中最经常使用的,一切的 headers 都只读
    下面离别引见request、body、response

request要求

了解了以上部份后,就晓得可以构建request来提议http要求,

myHeaders = new Headers({
  "Content-Type": "text/plain",
  "Content-Length": content.length.toString(),
  "X-Custom-Header": "ProcessThisImmediately",
});
//它的内容可以被猎取:
console.log(myHeaders.has("Content-Type")); // true
console.log(myHeaders.has("Set-Cookie")); // false
myHeaders.set("Content-Type", "text/html");
myHeaders.append("X-Custom-Header", "AnotherValue"); //http 头部信息

//属性
Request.method 只读
要求运用的要领 (GET, POST, 等.)
Request.url 只读
要求运用的 URL。
Request.headers 只读
要求所关联的 Headers 对象。
Request.context 只读  
要求的上下文 比方:(比方:audio, image, iframe, 等)
Request.referrer 只读
要求的泉源 (比方:client).
Request.mode 只读
要求的形式 (比方: cors, no-cors, same-origin).
Request.credentials 只读
要求的凭据 (比方: omit, same-origin).
Request.redirect 只读
怎样处置惩罚重定向形式 (比方: follow, error, or manual)
Request.integrity 只读
要求内容的 subresource integrity 值 (比方: sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=).
Request.cache 只读
要求的缓存形式 (比方: default, reload, no-cache).
Request implements Body, so it also has the following property available to it:

Body.bodyUsed 只读
指导body是不是被运用, 范例为Boolean

body要求正文

不管是要求照样相应都可以包括body对象. body也可所以以下恣意范例的实例.

ArrayBuffer
ArrayBufferView (Uint8Array and friends)
Blob/File
string
URLSearchParams
FormData
Body 类定义了以下要领 (这些要领都被 Request 和Response所完成)以猎取body内容. 这些要领都邑返回一个被剖析后的promise对象和数据.

Body.bodyUsed 只读
包括一个指导body是不是被读取过的 Boolean 值。
要领Edit

Body.arrayBuffer()
运用一个buffer数组来读取 Response流中的数据,并将bodyUsed状况改成已运用。
Body.blob()
运用一个Blob对象来读取 Response流中的数据,并将bodyUsed状况改成已运用。【二进制】
Body.formData()
运用一个 FormData 对象来读取 Response流中的数据,并将bodyUsed状况改成已运用【表单数据】。
Body.json()
运用一个 JSON 对象来读取 Response流中的数据,并将bodyUsed状况改成已运用【json】。
Body.text()
运用一个USVString (文本)
clone() 要领The clone() method of the Request interface creates a copy of the current Request object.

clone() throws a TypeError if the response Body has already been used. In fact, the main reason clone() exists is to allow multiple uses of Body objects (when they are one-use only.)

对象来读取 Response流中的数据,并将bodyUsed状况改成已运用。比起XHR来,这些要领让非文本化的数据运用起来越发简朴,由于这些要领都被 Request 和Response所完成。

返回 response

假如碰到收集故障,fetch() promise 将会 reject,带上一个 TypeError 对象。虽然这个状况经常是碰到了权限题目或类似题目——比方 404 不是一个收集故障。想要准确的推断 fetch() 是不是胜利,须要包括 promise resolved 的状况,此时再推断 Response.ok 是不是是为 true。
response的属性和要领:

Response.type 只读
包括Response的范例 (比方, basic, cors).
Response.url 只读
包括Response的URL.
Response.useFinalURL
包括了一个布尔值来标示这是不是是该Response的终究URL.
Response.status 只读
包括Response的状况码 (比方, 200 胜利).
Response.ok 只读
包括了一个布尔值来标示该Response胜利(状况码200-299) 照样失利.
Response.statusText 只读
包括了与该Response状况码一致的状况信息 (比方, OK对应200).
Response.headers 只读
包括此Response所关联的Headers 对象.
Response 完成了 Body, 所以以下属性一样可用:

Body.bodyUsed 只读
 包括了一个布尔值来标示该Response是不是读取过Body.
Response.clone()
建立一个Response对象的克隆
Response.error()
返回一个绑定了收集毛病的新的Response对象
Response.redirect()
用另一个URL建立一个新的 response.
Response 完成了 Body, 所以以下要领一样可用
    原文作者:caoweiju
    原文地址: https://segmentfault.com/a/1190000010417624
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞