異步請(qǐng)求fetch之初體驗(yàn)

導(dǎo)讀

傳遞信息到服務(wù)器,從服務(wù)器獲取信息弟断,是前端發(fā)展的重中之重,尤其是現(xiàn)在前后端分離的大前提下趴生,前后端的數(shù)據(jù)交互是前端的必修科目了阀趴。從很久之前到現(xiàn)在,ajax都是每個(gè)前端入行者必須技能苍匆。當(dāng)然為了便于開發(fā)者刘急, 各種三方工具將ajax包裝,然后給開發(fā)者使用浸踩,jquery叔汁、axios等等。這都不是今天的重點(diǎn)检碗, 今天要說(shuō)一個(gè)JavaScript原生的獲取資源接口 Fetch API据块, 雖然各大瀏覽器支持率不高,但是這樣的一個(gè)概念確實(shí)值得了解學(xué)習(xí)折剃,并且現(xiàn)在我們可以通過(guò)polyfill來(lái)實(shí)現(xiàn)不同瀏覽器的兼容性問(wèn)題

Fetch

先來(lái)看看各個(gè)瀏覽器對(duì)fetch的原生支持情況另假,可以看到支持性并不是很高,safari在10.1 之后才支持怕犁,ios更是10.3之后才支持边篮,IE完全不支持。當(dāng)然新技術(shù)的發(fā)展總會(huì)經(jīng)歷這個(gè)過(guò)程奏甫。不過(guò)戈轿,想提前嘗嘗鮮也是可以的我們可以使用 polyfill

Fetch原生支持

聲明:以下的所有代碼測(cè)試都是基于 Chrome 實(shí)現(xiàn)

廢話不多說(shuō),

fetch 返回的是一個(gè)Promise扶檐,我們先來(lái)看一個(gè)基本的 fetch 結(jié)構(gòu)

fetch(url, option).then( res => {
    //do something
}).catch(err => {
    //do something
})

fetch 的url 參數(shù)是必須的凶杖,option參數(shù)可選
以上就是整個(gè)的請(qǐng)求以及處理過(guò)程胁艰, 驚不驚喜款筑,意不意外智蝠,沒錯(cuò)就是這么簡(jiǎn)單清晰明了,沒有原生ajax的那些 XMLHttpRequest bulabula 一大堆奈梳。也不需要再額外引入一個(gè)jquery包(當(dāng)然項(xiàng)目中使用到的話除外)杈湾。當(dāng)然因?yàn)閒etch的返回值是一個(gè)Promise, 不需要再去使用回調(diào)函數(shù)從而有效避免回調(diào)地獄攘须。

當(dāng)然漆撞,fetch不止于此,我們的需求也不止于此于宙,我們可能需要post請(qǐng)求浮驳,可能需要跨域請(qǐng)求,控制從服務(wù)器獲取的信息的格式(json捞魁、string至会、blob等),此時(shí)谱俭,便需要設(shè)置參數(shù)信息奉件,對(duì)返回信息進(jìn)行處理。

option

來(lái)看看fetch的可選參數(shù)option的可選值昆著,fetch默認(rèn)是get方法县貌,也可以在option中設(shè)置為其他方法

  • method:get | post 等方法
  • headers:任何你想加到請(qǐng)求中的頭,可以是對(duì)象字面量的方式也可以是通過(guò) Headers
  • body:發(fā)送給服務(wù)器的信息凑懂, 可以是JSON, ufferSource, FormData, URLSearchParams, 或 USVString煤痕。注意get和HEAD請(qǐng)求沒有body
  • mode:請(qǐng)求模式, 可選值為 cors, no-cors, same-origin, 或 navigate接谨,cors-with-forced-preflight杭攻。默認(rèn)值應(yīng)該為 cors。但在Chrome中疤坝,Chrome 47 之前的版本默認(rèn)值為 no-cors 兆解,自Chrome 47起,默認(rèn)值為same-origin跑揉。--MDN Request
  • credentials:在請(qǐng)求中是否需要憑據(jù)锅睛。在請(qǐng)求數(shù)據(jù)中根據(jù)是否需要攜帶Cookie 來(lái)設(shè)置其值,可選值為omit(在請(qǐng)求中不懈怠認(rèn)證憑據(jù)(Cookie)), same-origin(在同原站點(diǎn)下包含憑據(jù)), 或 include(對(duì)所有網(wǎng)站包含認(rèn)證憑據(jù))
  • cache:如何處理緩存历谍,可取值有 default | no-store | no-cache | reload | force-cache | only-if-cached
  • redirect:對(duì)重定向的處理现拒,可取值 follow, error, redirect
  • referrer:一個(gè)指定了no-referrer, client, 或一個(gè) URL的 USVString 。默認(rèn)值是client.
  • integrity: 包括請(qǐng)求的 subresource integrity 值 (e.g., sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=).

mode

mode 參數(shù)便于 CORS望侈, 設(shè)置不同的值可以使在不同的請(qǐng)求方式下印蔬,使得請(qǐng)求有效。

  • cors:在同域和帶有CORS響應(yīng)頭的跨域下可以請(qǐng)求成功
  • no-cors:常用于在跨域不帶CORS場(chǎng)景下脱衙, 此時(shí)請(qǐng)求發(fā)出并且會(huì)有響應(yīng)侥猬,但是此時(shí)type為“opaque”例驹, status為0 ,js獲取不到返回?cái)?shù)據(jù)退唠。
  • same-origin:在同域下請(qǐng)求
  • cors-with-forced-preflight:在請(qǐng)求前進(jìn)行preflight 檢查
fetch("https://api.github.com/users/mzabriskie", {mode: "no-cors"}).then(response => {
    return response;
}).then(function(data) {
    console.log(data);
}).catch(function(e) {
    console.log("Oops, error");
});

執(zhí)行以上代碼返回

no-cors返回值信息
fetch("https://api.github.com/users/mzabriskie", {mode: "cors"}).then(response => {
    return response;
}).then(function(data) {
    console.log(data);
}).catch(function(e) {
    console.log("Oops, error");
});

以上代碼返回

cors返回值

headers

該參數(shù)的值可以為對(duì)象字面量

headers: {
    "Content-Type": "application/json"
}

也可以創(chuàng)建 Headers 對(duì)象鹃锈,通過(guò)append() 和delete() 等方法對(duì)其進(jìn)行操作,

var headers = new Headers();
headers.append( "Content-Type", "application/json");
fetch(url, {
    method: post,
    headers: headers,
    body: {
        name: "jack"
    }
})

Request

Fetch 提供了對(duì) Request 和 Response (以及其他與網(wǎng)絡(luò)請(qǐng)求有關(guān)的)對(duì)象的通用定義瞧预。所以在一個(gè)Fetch請(qǐng)求中屎债,完全可以只使用Request 和 Response兩個(gè)對(duì)象,通過(guò)Request 設(shè)置參數(shù)垢油,通過(guò)Response 對(duì)返回值進(jìn)行處理盆驹。
一個(gè)Fetch還可以寫成以下形式

var myHeaders = new Headers();
myHeaders.append('Content-Type', 'image/jpeg');

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

var myRequest = new Request('https://api.github.com/users/mzabriskie',option);

fetch(myRequest).then(function(response) {
    ... 
});

參數(shù)設(shè)置如 option 下介紹

Response

Fetch API 的Response接口呈現(xiàn)了對(duì)一次請(qǐng)求的響應(yīng)數(shù)據(jù)

其包含一次請(qǐng)求的響應(yīng)信息,響應(yīng)狀態(tài)等滩愁。
包含的一些常用屬性(只讀)

  • url:包含請(qǐng)求地址url
  • status:響應(yīng)狀態(tài)碼(200成功)
  • ok:一個(gè)布爾值標(biāo)識(shí)請(qǐng)求成功或失敗
  • statusText:包含與狀態(tài)碼對(duì)應(yīng)的狀態(tài)信息
  • headers:包含于請(qǐng)求關(guān)聯(lián)的Headers對(duì)象

****方法****

  • clone(): 創(chuàng)建Response對(duì)象的克隆

Response可以使用以下方法召娜,對(duì)響應(yīng)數(shù)據(jù)進(jìn)行處理

arrayBuffer()、blob()惊楼、formData()玖瘸、json()、text()等
以下為使用json() 方法返回的數(shù)據(jù)信息

fetch("https://api.github.com/users/mzabriskie", {mode: "no-cors"}).then(response => {
    return response.json();
}).then(function(data) {
    console.log(data);
}).catch(function(e) {
    console.log("Oops, error");
});
cors json()返回值

檢測(cè)請(qǐng)求是否成功

同XMLHttpResponse一樣檀咙,請(qǐng)求發(fā)出雅倒,服務(wù)器發(fā)出返回碼,除了407以外弧可,其不會(huì)進(jìn)入錯(cuò)誤捕捉蔑匣。也就是說(shuō)除了網(wǎng)絡(luò)故障或者跨域請(qǐng)求被拒絕等請(qǐng)求失敗的情況,fetch() 的Promise是不會(huì) reject的棕诵,所以為了請(qǐng)求能按照我們的預(yù)期實(shí)現(xiàn)裁良,我們必須加一個(gè)判斷,判斷請(qǐng)求是否成功并返回了我們想要的數(shù)據(jù)校套。我們當(dāng)然可以像 XMLHttpResponse 一樣對(duì)響應(yīng)的狀態(tài)碼進(jìn)行判斷价脾,不過(guò)我們還有選擇,對(duì)response.ok 這個(gè)布爾值入手笛匙。
細(xì)心的同學(xué)可能從之前的截圖中看到侨把,在請(qǐng)求成功和失敗的情況下,屬性 ok 的值 分別為true 和false 這里就不贅余天價(jià)截圖了妹孙,上代碼

fetch("https://api.github.com/users/mzabriskie", {mode: "cors"}).then(response => {
    if(response.ok) {
        response.json().then(data => {
            console.log(data);
        });
    } else {
        console.log("請(qǐng)求不成功秋柄,狀態(tài)碼為", response.status);
    }
}).catch(function(e) {
    console.log("Oops, error");
});

致此, 一個(gè) fetch 的簡(jiǎn)單請(qǐng)求便完成了蠢正,但是fetch功能遠(yuǎn)不止這些

fetch 與 ES7的async/await 搭配使用等等骇笔,路很長(zhǎng)一步一腳印

參考鏈接

Fetch API - Web API 接口 | MDN
Request - Web API 接口 | MDN
Headers - Web API 接口 | MDN
Response - Web API 接口 | MDN
Body - Web APIs | MDN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笨触,更是在濱河造成了極大的恐慌懦傍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旭旭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡葱跋,警方通過(guò)查閱死者的電腦和手機(jī)持寄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娱俺,“玉大人稍味,你說(shuō)我怎么就攤上這事≤恚” “怎么了模庐?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)油宜。 經(jīng)常有香客問(wèn)我掂碱,道長(zhǎng),這世上最難降的妖魔是什么慎冤? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任疼燥,我火速辦了婚禮,結(jié)果婚禮上蚁堤,老公的妹妹穿的比我還像新娘醉者。我一直安慰自己,他們只是感情好披诗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布撬即。 她就那樣靜靜地躺著,像睡著了一般呈队。 火紅的嫁衣襯著肌膚如雪剥槐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天宪摧,我揣著相機(jī)與錄音才沧,去河邊找鬼。 笑死绍刮,一個(gè)胖子當(dāng)著我的面吹牛温圆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孩革,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼岁歉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锅移,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熔掺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后非剃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體置逻,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年备绽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了券坞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肺素,死狀恐怖恨锚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倍靡,我是刑警寧澤猴伶,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站塌西,受9級(jí)特大地震影響鸡号,放射性物質(zhì)發(fā)生泄漏劈猪。R本人自食惡果不足惜伟阔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一厘灼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栖忠,春花似錦崔挖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捐川,卻和暖如春脓鹃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古沥。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工瘸右, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人岩齿。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓太颤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盹沈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子龄章,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器做裙,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • JavaScript 通過(guò)XMLHttpRequest(XHR)來(lái)執(zhí)行異步請(qǐng)求岗憋,這個(gè)方式已經(jīng)存在了很長(zhǎng)一段時(shí)間。雖...
    Bruce_zhuan閱讀 2,451評(píng)論 1 10
  • 本文詳細(xì)介紹了 XMLHttpRequest 相關(guān)知識(shí)锚贱,涉及內(nèi)容: AJAX仔戈、XMLHTTP、XMLHttpReq...
    semlinker閱讀 13,613評(píng)論 2 18
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,869評(píng)論 6 13
  • 引用自HTTP訪問(wèn)控制(CORS) 當(dāng) Web 資源請(qǐng)求由其它域名或端口提供的資源時(shí)拧廊,會(huì)發(fā)起跨域 HTTP 請(qǐng)求(...
    有涯逐無(wú)涯閱讀 2,566評(píng)論 0 4