AJAX:
Fetch API
傳統 AJAX 操作是使用 XMLHttpRequest(XHR)物件來實現,而 Fetch API 是近年來被提及將要取代 XMLHttpRequest 的技術新標準,是一個 HTML5 的 API。
1. 簡介
Fetch 並不是 XMLHttpRequest 的升級版本,不是 jQuery 提供的 $.ajax 語法或 AXIOS 那種原生 XHR 的封裝。它是一個全新的東西,並且基於 Promise 語法結構所設計,可配合使用 Async/Await 語法,使程式更加優雅。
Fetch 的解決了一些 XHR 問題,例如,解決回呼地獄,使用起來更加簡潔、不需要加載函式庫等等。
常被提及可能取代 XHR,但它也不是完全沒有缺點,沒辦法像 XHR 處理更細節的東西,例如,無法對請求進度、愈時請求做處理,只對網路請求報錯等等。
2. 範例
取得假資料 JSON,API:
|
|
傳統 XMLHttpRequest 需要好幾行的操作:
|
|
而 Fetch 只需要短短幾行:
|
|
使用 Async/Await 更直覺:
|
|
Request 物件
使用 Fetch 最簡單的方式就是透過 fetch(),但再這之前,我們先來理解什麼是 Request 物件,
Request 物件代表資源請求,建構式接受一個或兩個參數:
|
|
input:url,獲取資源的網址;init:一個可選物件,包含希望被包括到請求中的各種自定義選項。
init 物件中選項如下:
method:指定 HTTP 請求方法,例如 GET、POST、DELETE等等(預設為 GET)。headers:任何你想加到請求中的 Headers 物件(預設{}空物件)。body:需要發送的內容,如果method為 GET 或 HEAD 則不設定。mode:請求的模式。cors允許跨域(預設)no-cors只允許使用 HEAD、GET、POST 方法same-origin只允許同源請求,否則直接報錯navigate支持頁面導航
credentials:表示是否發送cookie。omit不發送 cookiesame-origin僅在同源時發送 cookie(預設)include發送cookie
cache:請求中想要使用處理緩存的策略,預設為default,其他可以參考 cache mode 。redirect:對重定向處理的模式manual需要用戶手動跟隨(預設)follow跟隨error發生錯誤
integrity:包含一個用於驗證資資源完整性的字串。
fetch 方法
fetch 方法有兩種呼叫方式:
- 接受 Request 物件作為參數;
- 符合建構 Request 物件的參數作為參數。
|
|
fetch() 函式會回傳一個狀態為 fulfilled 的 Promise 物件,resolves 為一個 Response 物件。
要注意的是,某些錯誤的 HTTP 狀態下如 404、500 等還是會回傳 fulfilled 狀態的 Promise。只有在有網絡錯誤會導致請求不能完成時,才會回傳 rejected 狀態的 Promise,因此需要做封裝處理才能判斷。
1. POST 範例
GET 因為是預設的請求的模式,所以不一定要設定參數,那麼我來看一下 POST 請求的範例:
|
|
Response 物件
Response 物件代表請求的回應。
1. 屬性
fetch() 只有在有網絡錯誤會導致請求不能完成時,才會回傳 rejected 狀態的 Promise,因此如果要查看 HTTP 錯誤,可以在回傳的 Response 物件中使用以下屬性:
status:狀態代碼(整數)。ok:狀態結果(布林值),成功回傳true(HTTP 狀態碼的範圍在 200-299),失敗回傳false。
|
|
Response 的其他屬性可以參考 MDN。
目前階段還沒辦法取得回應資料,接下會說明。
2. 方法
Response 物件中的 body 屬性提供了一個 ReadableStream 的實體,這個就是存放回應資料的地方。
我們可以使用以下 Response 提供的方法來讀取 body 屬性:
arrayBuffer()blob()json()text()formData()
以上方法回傳一個被解析為對應格式的 Promise 物件。
body 屬性只能讀取一次,讀取過後 bodyUsed 屬性會變成 true 表示已讀,若再次呼叫方法讀取 body 屬性就會報錯(TypeError: body stream is locked),若要重複讀取可以使用 clone() 建立一份 Response 的複製物件。
|
|