Fetch API

Fetch API

XMLHttpRequest的問題

  1. 所有的功能全部集中在同一個對象上寇仓,容易寫出不易維護的代碼
  2. 采用傳統(tǒng)的事件驅動模式乔煞,無法適配新的Promise API

Fetch API的特點

  1. 并非取代AJAX岭辣,而是對AJAX的一種改進
  2. 精細的功能分割:頭部信息搁廓,請求信息押袍,響應信息等均分布到不同的對象诵冒,更利于處理各種復雜的AJAX場景
  3. 使用了Promise API,更利于異步代碼的書寫
  4. Fetch API不是ES6的內容谊惭,而是HTML5新增的web API
  5. 需要有網(wǎng)絡通信的知識

基本使用

請求測試地址:http://api.kuanglinfeng.com

使用fetch函數(shù)即可向服務器發(fā)送網(wǎng)絡請求

  async function getList() {
    const url = 'http://api.kuanglinfeng.com'
    const config = {
      method: 'GET',
      headers: {
        "Content-Type": "application/json",
        // mode: 'no-cors'
      }
    }
    const data = await fetch(url, config).then(response => {
      return response.json()
    })
    console.log(data)
  }

  const button = document.querySelector('button')

  button.addEventListener('click', async () => {
    await getList()
  })

參數(shù)

該函數(shù)有兩個參數(shù):

  1. 必填汽馋,字符串,請求地址
  2. 選填圈盔,對象豹芯,請求配置

參數(shù)2(請求配置對象)的屬性:

  • method:字符串,請求方法驱敲,默認值GET
  • headers:對象铁蹈,請求頭信息
  • body:請求體的內容,必須匹配請求頭中的Content-Type
  • mode:字符串众眨,請求模式
    • cors:默認值握牧,配置為該值,會在請求頭中加入origin和referer
    • no-cors:配置為該值娩梨,不會在請求頭中加入origin和referer沿腰,跨域的時候可能會出現(xiàn)問題
    • same-origin:指示請求必須在同一個域中發(fā)生,如果請求其它域狈定,則會報錯
  • credentials:如何攜帶憑據(jù)(cookie)
    • omit:默認值颂龙,不攜帶cookie
    • same-origin:請求同源地址時攜帶cookie
    • include:請求任何地址都攜帶cookie
  • cache:配置緩存模式
    • default:表示fetch請求之前將檢查下http緩存
    • no-store:表示fetch請求將完全忽略http緩存的存在,這意味著請求之前將不再檢查下http的緩存掸冤,拿到響應后厘托,它也不會更新http緩存
    • no-cache:如果存在緩存,那么fetch將發(fā)送一個條件查詢request和一個正常的request稿湿,拿到響應后會更新http緩存
    • reload:表示fetch請求之前將忽略http緩存的存在铅匹,但是請求拿到響應后,它將主動更新http緩存
    • force-cache:表示fetch請求不顧一切的依賴緩存饺藤,即使緩存過期了包斑,它依然從緩存讀取,除非沒有任何緩存涕俗,那么它將發(fā)送一個正常的request
    • only-if-cached:表示fetch請求不顧一切的依賴緩存罗丰,即使緩存過期了,依舊從緩存中讀取再姑,如果沒有緩存萌抵,將拋出網(wǎng)絡錯誤(該設置只在mode為same-origin有效)

返回值

fetch函數(shù)返回一個Promise對象

  • 當收到服務器的返回結果后,Promise進入resolve狀態(tài),狀態(tài)數(shù)據(jù)為Response對象
  • 當網(wǎng)絡發(fā)生錯誤(或其它導致無法完成交互的錯誤)時绍填,Promise進入reject狀態(tài)霎桅,狀態(tài)數(shù)據(jù)為錯誤信息

Response對象

  • ok:boolean,當響應碼在200-299之間為true讨永,其它為false
  • status:number滔驶,響應的狀態(tài)碼
  • text():用于處理文本格式的Ajax響應,它從響應中獲取文本流卿闹,將其讀完揭糕,然后返回一個被resolve為string對象的Promise
  • blob():用于處理二進制文件格式(圖片、電子表格等)的Ajax響應锻霎,它讀取文件的原始數(shù)據(jù)著角,一旦讀取完整個文件,就返回一個被resolve為blob對象的Promise
  • json():用于處理JSON格式的Ajax響應量窘,它將JSON數(shù)據(jù)流轉換為一個被resolve為JavaScript對象的Promise
  • redirect():可以用于重定向到另一個URL雇寇,它會創(chuàng)建一個新的Promise,resolve來自重定向的URL的響應

Request對象

除了Fetch API上面的基本用法外(實際fetch內部會幫你創(chuàng)建Request對象)蚌铜,還可以通過創(chuàng)建一個Request對象來完成請求

  async function getList() {
    const url = 'http://api.kuanglinfeng.com'
    const config = {
      method: 'GET',
      headers: {
        "Content-Type": "application/json",
        // mode: 'no-cors'
      }
    }
    // 創(chuàng)建Request對象
    const request = new Request(url, config)
    const data = await fetch(request).then(response => {
      return response.json()
    })
    console.log(data)
  }

  const button = document.querySelector('button')

  button.addEventListener('click', async () => {
    await getList()
  })

注意:盡量保證每次請求都是一個新的Request對象

Headers對象

在Request和Response對象內部锨侯,會將傳遞的請求頭對象,轉換為Headers

Headers對象中的方法:

  • has(key):檢查請求頭中是否存在指定的key值
  • get(key):得到請求頭中對應的值
  • set(key, value):修改對應的鍵值對
  • append(key, value):添加鍵值對
  • keys():得到所有的請求頭鍵的數(shù)組
  • values():得到所有的請求頭值的數(shù)組
  • entries():得到所有請求頭中的鍵值對的數(shù)組
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末冬殃,一起剝皮案震驚了整個濱河市囚痴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌审葬,老刑警劉巖深滚,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涣觉,居然都是意外死亡痴荐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門官册,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生兆,“玉大人,你說我怎么就攤上這事膝宁⊙荒眩” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵员淫,是天一觀的道長合蔽。 經(jīng)常有香客問我,道長介返,這世上最難降的妖魔是什么拴事? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任沃斤,我火速辦了婚禮,結果婚禮上挤聘,老公的妹妹穿的比我還像新娘轰枝。我一直安慰自己捅彻,他們只是感情好组去,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著步淹,像睡著了一般从隆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缭裆,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天键闺,我揣著相機與錄音,去河邊找鬼澈驼。 笑死辛燥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缝其。 我是一名探鬼主播挎塌,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼内边!你這毒婦竟也來了榴都?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漠其,失蹤者是張志新(化名)和其女友劉穎嘴高,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體和屎,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拴驮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柴信。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套啤。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颠印,靈堂內的尸體忽然破棺而出纲岭,到底是詐尸還是另有隱情,我是刑警寧澤线罕,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布止潮,位于F島的核電站,受9級特大地震影響钞楼,放射性物質發(fā)生泄漏喇闸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燃乍。 院中可真熱鬧唆樊,春花似錦、人聲如沸刻蟹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舆瘪。三九已至片效,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間英古,已是汗流浹背淀衣。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留召调,地道東北人膨桥。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像唠叛,于是被迫代替她去往敵國和親只嚣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354