JS代替ajax向服務(wù)端請求的新方案:fetch

文檔: https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API
fetch墊片: https://github.com/github/fetch

fetch

跨網(wǎng)絡(luò)異步獲取資源的功能以前是使用XMLHttpRequest對象實現(xiàn)的塘淑,F(xiàn)etch API提供了更好的替代方案伟恶,可以很容易的被其他技術(shù)使用(如Servise Workers)

fetch缰冤,說白了鸣剪,就是XMLHttpRequest的一種替代方案蝉衣。如果有人問你,除了Ajax獲取后臺數(shù)據(jù)之外劳景,還有沒有其他的替代方案配紫?

你就可以回答视搏,除了XMLHttpRequest對象來獲取后臺的數(shù)據(jù)之外,還可以使用一種更優(yōu)的解決方案fetch县袱。

fetch的支持性還不是很好浑娜,但是在谷歌瀏覽器中已經(jīng)支持了fetch

兼容性查看:https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API

返回promise

Fetch API提供了一個全局的fetch()方法,該方法會返回一個Promise

當(dāng)fetch請求接收到一個代表錯誤的狀態(tài)碼時(如404式散、500)筋遭,返回的Promise不會被標(biāo)記為reject,而是被標(biāo)記為resolve暴拄,但是會將response的ok屬性設(shè)置為false漓滔。只有當(dāng)網(wǎng)絡(luò)錯誤或請求被阻止時才會被標(biāo)記為reject狀態(tài)

fetch('https://127.0.0.1/125.jpg').then(function(res){
  if(res.ok) {
    return res.blob();
  }else {
    console.log('服務(wù)器響應(yīng)出錯了'); // 資源404、服務(wù)器500等
  }
}).catch(function(err){
  console.log('Network response was not ok.'); // 網(wǎng)絡(luò)出錯
})

fetch() 方法的兩個參數(shù)

fetch()方法接收兩個參數(shù):第一個參數(shù)表示要獲取的資源路徑乖篷;第二個參數(shù)表示請求的配置項(可選)

fetch('https://127.0.0.1/api/articles/1/3').then(function(res){
  if(res.ok) {
    return res.json();
  }
})

// 定義第二個參數(shù)
fetch('https://127.0.0.1/api/articles/1/3', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    token:'token'
  },
  cache: 'default',
  mode: 'cors',
}).then(function(res){
  if(res.ok) {
    return res.json();
  }
})

設(shè)置請求的頭信息

在POST提交的過程中响驴,一般是表單提交,可是撕蔼,經(jīng)過查詢豁鲤,發(fā)現(xiàn)默認(rèn)的提交方式是:Content-Type:text/plain;charset=UTF-8,這個顯然是不合理的,改為application/x-www-form-urlencoded

fetch('https://www.baidu.com/search/error.html', {
    method: 'POST',
    headers: new Headers({
      'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式為表單提交
    }),
    body: new URLSearchParams([["foo", 1],["bar", 2]]).toString()
  })
  .then((res)=>{
    return res.text()
  })
  .then((res)=>{
    console.log(res)
  })

默認(rèn)不使用 cookie

默認(rèn)情況下, fetch 不會從服務(wù)端發(fā)送或接收任何 cookies罕邀,要發(fā)送 cookies畅形,必須設(shè)置 credentials 選項

fetch('http://127.0.0.1/search/name', {
    method: 'GET',
    credentials: 'include' // 強(qiáng)制加入憑據(jù)頭
  })
  .then((res)=>{
    return res.text()
  })

GET請求及傳參

GET請求中如果需要傳遞參數(shù)怎么辦?這個時候诉探,只能把參數(shù)寫在URL上來進(jìn)行傳遞了日熬。

fetch('http://127.0.0.1/search?a=1&b=2', { // 在URL中寫上傳遞的參數(shù)
    method: 'GET'
  })
  .then((res)=>{
    return res.text()
  })

POST 請求及傳參

POST請求的參數(shù),放在第二個參數(shù)的body屬性中

fetch('http://127.0.0.1/searchs', { 
     method: 'POST',
    body: new URLSearchParams([["foo", 1],["bar", 2]]).toString() // 這里是請求對象
  })
  .then((res)=>{
    return res.text()
  })

POST提交改為application/x-www-form-urlencoded

fetch('http://127.0.0.1/searchs', { 
    method: 'POST',
    headers: new Headers({
      'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式為表單提交
    }),
    body: new URLSearchParams([["foo", 1],["bar", 2]]).toString() // 這里是請求對象
  })
  .then((res)=>{
    return res.text()
  })

通過接口得到JSON數(shù)據(jù)

fetch('http://127.0.0.1/searchs', { 
    method: 'POST',
    headers: new Headers({
      'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式為表單提交
      'Accept': 'application/json' // 通過頭指定肾胯,獲取的數(shù)據(jù)類型是JSON
    }),
    body: new URLSearchParams([["foo", 1],["bar", 2]]).toString() // 這里是請求對象
  })
  .then((res)=>{
    return res.text()
  })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竖席,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敬肚,更是在濱河造成了極大的恐慌毕荐,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艳馒,死亡現(xiàn)場離奇詭異憎亚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弄慰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門第美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陆爽,你說我怎么就攤上這事什往。” “怎么了慌闭?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵别威,是天一觀的道長躯舔。 經(jīng)常有香客問我,道長省古,這世上最難降的妖魔是什么粥庄? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衫樊,結(jié)果婚禮上飒赃,老公的妹妹穿的比我還像新娘。我一直安慰自己科侈,他們只是感情好载佳,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臀栈,像睡著了一般蔫慧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上权薯,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天姑躲,我揣著相機(jī)與錄音,去河邊找鬼盟蚣。 笑死黍析,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屎开。 我是一名探鬼主播阐枣,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奄抽!你這毒婦竟也來了蔼两?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逞度,失蹤者是張志新(化名)和其女友劉穎额划,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體档泽,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俊戳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了馆匿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抑胎。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甜熔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛋逾,我是刑警寧澤蚂蕴,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站嗜侮,受9級特大地震影響焊虏,放射性物質(zhì)發(fā)生泄漏淡喜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一诵闭、第九天 我趴在偏房一處隱蔽的房頂上張望炼团。 院中可真熱鬧,春花似錦疏尿、人聲如沸瘟芝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锌俱。三九已至,卻和暖如春敌呈,著一層夾襖步出監(jiān)牢的瞬間贸宏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工磕洪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留吭练,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓析显,卻偏偏與公主長得像鲫咽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叫榕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 參考AJAX 之 XHR, jQuery, Fetch 的對比[https://zhuanlan.zhihu.co...
    合肥黑閱讀 3,435評論 0 3
  • # Ajax標(biāo)簽(空格分隔): 筆記整理---[TOC]### 從輸入網(wǎng)址開始:- 在學(xué)習(xí)ajax之前浑侥,你應(yīng)該先了...
    V8閱讀 253評論 1 0
  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,698評論 1 56
  • 瀏覽器(二) (操作表單晰绎、操作文件寓落、AJAX、Promise和Canvas) 操作表單 用JavaScript操作...
    星騰_范特西閱讀 474評論 0 0
  • 文/蘇卿揚(yáng) 2. 到了正午荞下,太陽從厚重的云層露出伶选,天氣變得越發(fā)的溫暖了,覆蓋在屋檐上的冰雪也抵抗不了太陽溫暖的懷抱...
    蘇卿揚(yáng)閱讀 250評論 0 0