AJAX:
XMLHttpRequest
雖然現在很少人會直接使用原生 XMLHttpRequest 物件 來處理 AJAX,但還是需要理解運作原理。
1. 請求
基本三步驟:
- 建立一個 XMLHttpRequest 物件;
- 設定請求;
- 傳送請求。
|
|
1.1 open 方法
XMLHttpRequest.open()
可以設定一個請求。
|
|
必要參數:
method
:指定 HTTP 請求方法,例如 GET、POST、DELETE等等。url
:為請求的伺服器網址。
可選參數:
async
:預設為true
表示要用非同步的方式進行,如果設為false
則會以同步的方式來發送請求。user
、password
:預設為null
,為使用者名稱、密碼,視伺服器有無要求驗證而設置。
1.2 send 方法
XMLHttpRequest.send()
用來對伺服器傳送請求。
|
|
可選參數 body
資料本體,若使用 GET
請求,不帶資料時,可省略不寫或是傳入 null
。
2. 伺服器回應
當瀏覽器從伺服器端接收資料回應後,便會觸發 load
事件,因此可以藉由事件監聽,先判斷回應狀態:
|
|
XMLHttpRequest.status
會回傳 XMLHttpRequest 物件目前的狀態碼,可用來確認回應是否成功。
HTTP 狀態碼:
- 1xx: 資訊回應;
- 2xx: 成功回應;
- 3xx: 重定向;
- 4xx: 用戶端錯誤;
- 5xx: 伺服器端錯誤;
- 詳細 HTTP 狀態碼 請參考 MDN。
除了 load
事件外,還有很多事件:
loadstart
:請求開始;progress
:請求進度;abort
:請求終止;error
:發生連接錯誤;load
:請求成功完成;timeout
:請求超時;loadend
:請求結束。
除了監聽 load
事件外,也可以監聽 onreadystatechange
事件。在發一個請求後,如果想追蹤請求當前處於哪種狀態,可以使用 XMLHttpRequest.readyState
,查看請求狀態:
0
:UNSENT 狀態,客戶端已被建立,但open()
方法尚未被呼叫。1
:OPENED 狀態,open()
方法已被呼叫,但還沒傳送資料。2
:HEADERS_RECEIVED 狀態,send()
方法已被呼叫,而且可取得 header 與狀態。3
:LOADING 狀態,回應資料下載中,此時responseText
會擁有部分資料。4
:DONE 狀態,完成下載操作。
readyState = 4
就類似 loadend
事件:
|
|
3. 處理回應資料
確認伺服器成功回應,接下來就是處理資料。
共有三種方式,可以獲取請求後的回應資料:
responseText
回傳 DOMString
,responseXML
回傳 HTML 或 XML 的 Document
。而 response
回傳的資料類型取決於 XMLHttpRequest.responseType
。
範例,GET 一個 JSON 資料並轉成物件:
|
|
HTTP Header
使用 POST 請求時,send()
傳送資料給伺服器前,還需要使用 XMLHttpRequest.setRequestHeader()
設定內容類型,告知伺服器我們傳遞的資料格式。
舉例來說,如果我們要傳遞的是 JSON 格式的資料:
|
|
語法:
|
|
header
:表頭名稱。value
:編碼類型。
模擬 HTTP 回應工具 Mocky
FormData 物件
若使用 FormData 物件從表單獲取資料,可以直接使用 send()
傳送,setRequestHeader()
會自動設置。