如何獲取fetch

fetch和XMLHttpRequest

如果看網上的fetch教程窒篱,會首先對比XMLHttpRequest和fetch的優(yōu)劣,然后引出一堆看了很快會忘記的內容(本人記性不好)胜蛉。因此雳窟,我寫一篇關于fetch的文章相艇,為了自己看著方便唯笙,畢竟工作中用到的也就是一些很基礎的點而已肌访。

fetch找默,說白了,就是XMLHttpRequest的一種替代方案吼驶。如果有人問你惩激,除了Ajax獲取后臺數(shù)據(jù)之外,還有沒有其他的替代方案蟹演?

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

如何獲取fetch

到現(xiàn)在為止骡技,fetch的支持性還不是很好,但是在谷歌瀏覽器中已經支持了fetch羞反。fetch掛在在BOM中布朦,可以直接在谷歌瀏覽器中使用。

查看fetch的支持情況:fetch的支持情況

當然昼窗,如果不支持fetch也沒有問題是趴,可以使用第三方的ployfill來實現(xiàn)只會fetch:whatwg-fetch

fetch的helloworld

下面我們來寫第一個fetch獲取后端數(shù)據(jù)的例子:

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/search/error.html') // 返回一個Promise對象
  .then((res)=>{
    return res.text() // res.text()是一個Promise對象
  })
  .then((res)=>{
    console.log(res) // res是最終的結果
  })

是不是很簡單?可能難的地方就是Promise的寫法澄惊,這個可以看阮一峰老師的ES6教程來學習唆途。

說明一點,下面演示的GET請求或POST請求缤削,都是采用百度中查詢到的一些接口窘哈,可能傳遞的有些參數(shù)這個接口并不會解析,但不會影響這個接口的使用亭敢。

GET請求

GET請求初步

完成了helloworld滚婉,這個時候就要來認識一下GET請求如何處理了。

上面的helloworld中這是使用了第一個參數(shù)帅刀,其實fetch還可以提供第二個參數(shù)让腹,就是用來傳遞一些初始化的信息。

這里如果要特別指明是GET請求扣溺,就要寫成下面的形式:

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/search/error.html', {
    method: 'GET'
  })
  .then((res)=>{
    return res.text()
  })
  .then((res)=>{
    console.log(res)
  })

GET請求的參數(shù)傳遞

GET請求中如果需要傳遞參數(shù)怎么辦骇窍?這個時候,只能把參數(shù)寫在URL上來進行傳遞了锥余。

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/search/error.html?a=1&b=2', { // 在URL中寫上傳遞的參數(shù)
    method: 'GET'
  })
  .then((res)=>{
    return res.text()
  })
  .then((res)=>{
    console.log(res)
  })

POST請求

POST請求初步

與GET請求類似腹纳,POST請求的指定也是在fetch的第二個參數(shù)中:

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/search/error.html', {
    method: 'POST' // 指定是POST請求
  })
  .then((res)=>{
    return res.text()
  })
  .then((res)=>{
    console.log(res)
  })

POST請求參數(shù)的傳遞

眾所周知,POST請求的參數(shù),一定不能放在URL中嘲恍,這樣做的目的是防止信息泄露足画。

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/search/error.html', {
    method: 'POST',
    body: new URLSearchParams([["foo", 1],["bar", 2]]).toString() // 這里是請求對象
  })
  .then((res)=>{
    return res.text()
  })
  .then((res)=>{
    console.log(res)
  })

其實除了對象URLSearchParams外,還有幾個其他的對象佃牛,可以參照:常用的幾個對象來學習使用淹辞。

設置請求的頭信息

在POST提交的過程中,一般是表單提交俘侠,可是象缀,經過查詢,發(fā)現(xiàn)默認的提交方式是:Content-Type:text/plain;charset=UTF-8爷速,這個顯然是不合理的央星。下面咱們學習一下,指定頭信息:

// 通過fetch獲取百度的錯誤提示頁面
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)
  })

這個時候惫东,在谷歌瀏覽器的Network中查詢等曼,會發(fā)現(xiàn),請求方式已經變成了content-type:application/x-www-form-urlencoded凿蒜。

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

上面所有的例子中都是返回一個文本禁谦,那么除了文本,有沒有其他的數(shù)據(jù)類型呢废封?肯定是有的州泊,具體查詢地址:Body的類型

由于最常用的是JSON數(shù)據(jù),那么下面就簡單演示一下獲取JSON數(shù)據(jù)的方式:

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/rec?platform=wise&ms=1&rset=rcmd&word=123&qid=11327900426705455986&rq=123&from=844b&baiduid=A1D0B88941B30028C375C79CE5AC2E5E%3AFG%3D1&tn=&clientWidth=375&t=1506826017369&r=8255', { // 在URL中寫上傳遞的參數(shù)
    method: 'GET',
    headers: new Headers({
      'Accept': 'application/json' // 通過頭指定漂洋,獲取的數(shù)據(jù)類型是JSON
    })
  })
  .then((res)=>{
    return res.json() // 返回一個Promise遥皂,可以解析成JSON
  })
  .then((res)=>{
    console.log(res) // 獲取JSON數(shù)據(jù)
  })

強制帶Cookie

默認情況下, fetch 不會從服務端發(fā)送或接收任何 cookies, 如果站點依賴于維護一個用戶會話,則導致未經認證的請求(要發(fā)送 cookies刽漂,必須發(fā)送憑據(jù)頭).

// 通過fetch獲取百度的錯誤提示頁面
fetch('https://www.baidu.com/search/error.html', {
    method: 'GET',
    credentials: 'include' // 強制加入憑據(jù)頭
  })
  .then((res)=>{
    return res.text()
  })
  .then((res)=>{
    console.log(res)
  })

簡單封裝一下fetch

最后了演训,介紹了一大堆內容,有沒有發(fā)現(xiàn)贝咙,在GET和POST傳遞參數(shù)的方式不同呢样悟?下面咱們就來封裝一個簡單的fetch,來實現(xiàn)GET請求和POST請求參數(shù)的統(tǒng)一庭猩。

/**
 * 將對象轉成 a=1&b=2的形式
 * @param obj 對象
 */
function obj2String(obj, arr = [], idx = 0) {
  for (let item in obj) {
    arr[idx++] = [item, obj[item]]
  }
  return new URLSearchParams(arr).toString()
}

/**
 * 真正的請求
 * @param url 請求地址
 * @param options 請求參數(shù)
 * @param method 請求方式
 */
function commonFetcdh(url, options, method = 'GET') {
  const searchStr = obj2String(options)
  let initObj = {}
  if (method === 'GET') { // 如果是GET請求窟她,拼接url
    url += '?' + searchStr
    initObj = {
      method: method,
      credentials: 'include'
    }
  } else {
    initObj = {
      method: method,
      credentials: 'include',
      headers: new Headers({
        'Accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded'
      }),
      body: searchStr
    }
  }
  fetch(url, initObj).then((res) => {
    return res.json()
  }).then((res) => {
    return res
  })
}

/**
 * GET請求
 * @param url 請求地址
 * @param options 請求參數(shù)
 */
function GET(url, options) {
  return commonFetcdh(url, options, 'GET')
}

/**
 * POST請求
 * @param url 請求地址
 * @param options 請求參數(shù)
 */
function POST(url, options) {
  return commonFetcdh(url, options, 'POST')
}
GET('https://www.baidu.com/search/error.html', {a:1,b:2})
POST('https://www.baidu.com/search/error.html', {a:1,b:2})
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔼水,隨后出現(xiàn)的幾起案子震糖,更是在濱河造成了極大的恐慌,老刑警劉巖趴腋,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吊说,死亡現(xiàn)場離奇詭異论咏,居然都是意外死亡,警方通過查閱死者的電腦和手機颁井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門潘靖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚤蔓,你說我怎么就攤上這事『啵” “怎么了秀又?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贬芥。 經常有香客問我吐辙,道長,這世上最難降的妖魔是什么蘸劈? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任昏苏,我火速辦了婚禮,結果婚禮上威沫,老公的妹妹穿的比我還像新娘贤惯。我一直安慰自己,他們只是感情好棒掠,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布孵构。 她就那樣靜靜地躺著,像睡著了一般烟很。 火紅的嫁衣襯著肌膚如雪颈墅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天雾袱,我揣著相機與錄音恤筛,去河邊找鬼。 笑死芹橡,一個胖子當著我的面吹牛毒坛,可吹牛的內容都是我干的。 我是一名探鬼主播林说,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼粘驰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了述么?” 一聲冷哼從身側響起蝌数,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎度秘,沒想到半個月后顶伞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饵撑,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年唆貌,在試婚紗的時候發(fā)現(xiàn)自己被綠了滑潘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡锨咙,死狀恐怖语卤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情酪刀,我是刑警寧澤粹舵,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站骂倘,受9級特大地震影響眼滤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜历涝,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一诅需、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荧库,春花似錦堰塌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丐箩,卻和暖如春摇邦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屎勘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工施籍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人概漱。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓丑慎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓤摧。 傳聞我的和親對象是個殘疾皇子竿裂,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容