Fetch API提供了獲取資源(包括跨域請求)的接口。任何使用過XMLHttpRequest的人都可以輕松上手,新的API提供了更強大、更靈活的特性集。
Fetch提供了請求和響應、頭(以及其他與網絡請求相關的對象)的壹般定義。
Fetch()必須接受壹個參數——資源的路徑。無論請求成功與否,都返回壹個Promise對象,resolve對應請求的響應。還可以傳遞可選的第二個參數init。
壹旦返回了響應,您可以使用壹些方法來定義內容的形式以及如何處理它。您也可以通過request()和response()的構造函數直接創建請求和響應,但不建議這樣做。
Fetch API提供了壹個JavaScript接口,用於訪問和操作HTTP管道的某些特定部分,比如請求和響應。它還提供了壹個全局fetch()方法,該方法提供了壹種簡單而合理的方式來通過網絡異步獲取資源。
Fetch規範和jQuery.ajax()主要有以下區別:
在使用中,fetch()接受URL字符串作為參數,默認情況下向URL發送GET請求,並返回Promise對象。
這裏我們用節點環境來學習,當然在瀏覽器中比較有可比性,需要安裝基於節點的依賴包node-fetch,所以這裏壹定要註意版本問題。
同時,我們需要壹個Web服務來進行測試。這裏我們用python構建了壹個簡單的Web服務。
Data.json文件
準備工作完成後,我們開始愉快地學習吧。
基本的獲取請求很容易設置。請看下面的代碼:
這是從服務器獲取JSON數據的回調式請求。節點環境中的演示
fetch()收到的響應是壹個流對象,response.json()是壹個異步操作,把所有的內容取出來,變成json對象。
整理起來,和axios差不多。相似之處都是基於ES 6的無極對象。在節點環境下,它們都是基於HTTP模塊的。不同的是,axios基於XMLHttpRequest在瀏覽器中實現異步通信,fetch是壹個新的API,是XMLHttpRequest最新的替代技術。這裏有壹個axios的例子。
Promise可以用await語法重寫,使語義更加清晰。
Await語句必須放在try中...catch,以便捕獲異步操作中可能出現的錯誤。
fetch()請求成功後,您將獲得壹個響應對象。它對應於服務器的HTTP響應。
響應包含de synchronization屬性,該屬性對應於HTTP響應的頭,可以立即讀取。
response.ok:屬性返回指示請求是否成功的布爾值,其中true對應於HTTP請求的狀態代碼200到299,false對應於其他狀態代碼。
Response.status:該屬性返回壹個數字,指示HTTP響應的狀態代碼(例如,200,指示請求成功)。
Response.statusText:該屬性返回壹個字符串,指示HTTP響應的狀態信息(例如,請求成功後,服務器返回“OK”)。
Response.url:該屬性返回請求的url。如果URL中有跳轉,此屬性將返回最終的URL。
response.type:屬性返回請求的類型。可能的值如下:
我們在python的web服務接口中拋出壹個異常,然後直接進行catch。
執行錯誤:內部服務器錯誤,即500
修改接口返回的狀態碼是400。
報告錯誤請求
妳也可以直接根據反應來判斷
修改接口返回的狀態碼是404。
響應對象也有響應。Headers屬性,它指向對應於HTTP響應的所有頭的headers對象。
可以使用for遍歷標頭對象...循環的。
Headers對象提供下列方法來操作標題。HTTP響應,修改頭意義不大。
響應對象根據服務器返回的數據類型不同,提供不同的讀取方式。讀取方法是異步的,返回的都是Promise對象。您必須等到異步操作結束後,才能獲得服務器返回的完整數據。
response.text()可用於獲取文本數據,如HTML文件。」
" response.json()主要用於獲取服務器返回的json數據."
“response.formData()主要用在Service Worker中截取用戶提交的表單,修改壹些數據後再提交給服務器。」
“response.blob()用於獲取二進制文件。」
Response.arrayBuffer()主要用於獲取流媒體文件。
流對象只能讀壹次,然後就沒了。這意味著只能使用上壹節的五種讀取方法中的壹種,否則會報錯。
響應對象提供Response.clone()方法來創建響應對象的副本,實現多次讀取。
響應對象還有壹個Response.redirect()方法,用於將響應結果重定向到指定的URL。這種方法壹般只在服務人員中使用。
Response.body屬性是Response對象公開的底層接口,返回ReadableStream對象供用戶操作。
它可以用來讀取塊中的內容,它的應用之壹是顯示下載的進度。
fetch()的第壹個參數是URL,您也可以接受第二個參數作為配置對象來自定義HTTP請求。
HTTP請求的方法、頭和數據體都在這個對象中設置。
fetch()請求發出後,如果想中途取消,需要使用AbortController對象。
請求休眠10s,在5s終止請求,創建壹個新的AbortController實例,然後發送fetch()請求。configuration對象的signal屬性必須指定它接收由AbortController實例發送的信號controller.signal。
controller.abort()方法用於發出取消信號。此時,中止事件將被觸發。這個事件可以被監控,也可以通過controller.signal.aborted屬性判斷取消信號是否已經發出。
"節點環境"
Python環境