
XMLHttpRequest (XHR),是最常見的 JavaScript HTTP Client,支援IE,擷取資料的同時,卻 不需 進行 頁面重載 (page reload)!對於理解 其他 API的方式、舊系統體系的網頁開發、維護舊系統 皆能有所幫助。
使用目標
以 XMLHttpRequest (XHR) 對 https://steven5j.github.io/Blog/Data/Godzilla_Monster.json,
送出 GET 請求,回應的 影像 URI,添加至頁面
一、實例物件
var xhr = new XMLHttpRequest();
可使用XMLHttpRequest.readyState() 特性的數值用以判斷目前讀取資料的狀態。
| 值 | 狀態 | 說明 |
|---|---|---|
| 0 | UNSENT | 客戶端已被建立,但 open() 方法尚未被呼叫。 |
| 1 | OPENED | open() 方法已被呼叫。 |
| 2 | HEADERS_RECEIVED | send() 方法已被呼叫,而且可取得 header 與狀態。 |
| 3 | LOADING | 回應資料下載中,此時 responseText 會擁有部分資料。 |
| 4 | DONE | 完成下載操作。 |
二、設定請求
/*
* {string} 請求方法 (method)
* {string} 目標 url
* {boolean} 非同步 [async] -- 可選
* {string} 使用者 [user] -- 可選
* {string} 密碼 [password] -- 可選
*/
xhr.open("GET", "網址");使用 XMLHttpRequest.open(),設定請求,
請求方法(method) :一般是GET,除此之外還有POST、PUT、DELETE、HEAD、OPTIONS..等,詳細可查看->HTTP 請求方法
非同步/異步(async):預設是 true 非同步,詳細可查看->簡單理解 JavaScript Async 和 Await
※可使用 setRequestHeader() 方法,設置請求訊息的表頭欄位
三、監聽事件
使用 非同步,需監聽 XMLHttpRequest.onload()事件,
讓 回應完成時 能執行相對應的函式 — 回調函式 (callback):
// 非同步取得回應
xhr.onload = function () {
.............
...處理回應...
.............
............
.............
};※監聽事件:onload以外,也有如 load、onerror、onprogress 等,詳細查看->XMLHttpRequest
四、發送請求
XMLHttpRequest.send ()方法中的參數,是請求訊息的 酬載 (payload) 內容,
預設使用的 GET 方法,不得 送出 酬載,因此設為空值:
xhr.send(null);
五、處理回應
在 onload 事件內做處理回應的函式,
- (1)判斷HTTP 連線是否正常
- (2)判斷收到的文本格式。
(1)判斷HTTP連線狀態碼
XMLHttpRequest.status() 判斷HTTP狀態碼
- 資訊回應 (Informational responses, 100–199),
- 成功回應 (Successful responses, 200–299),
- 重定向 (Redirects, 300–399),
- 用戶端錯誤 (Client errors, 400–499),
- 伺服器端錯誤 (Server errors, 500–599).
console.log("HTTP連線狀態碼:" + xhr.status);
if( 200 <= xhr.status && xhr.status <= 299){ // (成功回應)
document.write("HTTP連線狀態碼:" + xhr.status);
// 使用簡易的 正規表達式,判斷媒體類型
if (type.match(/^application\/json/)) {
handler = new Handler(jsonHandler, JSON.parse(xhr.responseText));
} else if (type.match(/^application\/xml/)) {
handler = new Handler(textHandler, xhr.responseXML);
} else {
handler = new Handler(textHandler, xhr.responseText);
}
}
else if (300 <= xhr.status && xhr.status <= 399){ // (重定向)
document.write("HTTP連線狀態碼:" + xhr.status);
document.location.href("https://stevenjhu.com/");
}
else if (400 <= xhr.status && xhr.status <= 499){ //用戶端錯誤
document.write("HTTP連線狀態碼:" + xhr.status);
}
else if (500 <= xhr.status && xhr.status <= 599){ //用戶端錯誤
document.write("HTTP連線狀態碼:" + xhr.status);
}(2)判斷收到的文本格式
XMLHttpRequest.getResponseHeader() 函式取得回應的資料型態,也就是下面程式提到的”Content-Type”
回應 Text,透過 XMLHttpRequest.responseText 屬性,
回應 XML 或 XHTML,則使用 XMLHttpRequest.responseXML 屬性,
回應 JSON,則可以使用 JSON.parse() 方法,解析 XMLHttpRequest.responseText 屬性
// 取得回應的 Content-Type 表頭欄位
// 以決定如何處理回應
var type = xhr.getResponseHeader("Content-Type");
// 建構元 (strategy, response)
var handler;
// 使用簡易的 正規表達式,判斷媒體類型
if (type.match(/^application\/json/)) {
handler = new Handler(jsonHandler, JSON.parse(xhr.responseText));
} else if (type.match(/^application\/xml/)) {
handler = new Handler(textHandler, xhr.responseXML);
} else {
handler = new Handler(textHandler, xhr.responseText);
}
handler.handleResponse();六、輸出結果
看原本預計要怎麼輸出,可以使用簡單的方式,這裡就很簡單的載入圖片的方式。
// 簡易處理 JSON 回應處理 輸出格式
function jsonHandler(response) {
let data = response.results;
// 建立緩衝的文件片段 docFrag
let docFrag = document.createDocumentFragment();
for (var i = 0, l = data.length; i < l; i++) {
var url = data[i].url;
var img = document.createElement("img");
img.src = url;
img.width = 300;
// 將 img 添加至 docFrag
docFrag.appendChild(img);
}
// 將含有多個 img 的 docFrag
// 一次新增至 HTML 的 body 中
document.body.appendChild(docFrag);
}步驟回顧
1.實例物件,建立一個 XMLHttpRequest 物件
2.設定請求,open() 方法 傳送到伺服器要資料
3.監聽事件,設定onload 或其他監聽事件,回傳資料到自己的瀏覽器時的監聽事件。
4.發送請求,send() 方法送出資料。
5.處理回應,在 onload 事件內做處理回應的函式,(1)status()方法判斷HTTP 連線狀態碼是否正常 (2)getResponseHeader()判斷收到的文本格式。
6.輸出結果
POST、PUT..等HTTP連線請求
將 請求方法 換成 POST,並於 send() 方法 置入資料酬載(payload)。如果沒有資料的話,也可以直接使用POST。
伺服器端(Sever端)要設定POST連線方式,在前端(Client端)才可以用POST方法讀取。
xhr.open("POST", "網址");xhr.send(資料酬載);
使用其他 HTTP 請求方法 (e.g., PUT、DELETE、HEAD、OPTIONS) 也是一樣,
但必須注意,該方法是否允許發送 資料酬載(payload)。
範例網址目錄
參考資料:
AJAX JavaScript 與 jQuery 教學範例 for PHPhttps://www.footmark.info/programming-language/php/ajax-javascript-jquery-example-php/
AJAX與Fetch API:https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/ajax_fetch.html
AJAX簡介:https://www.w3schools.com/xml/ajax_intro.asp
XMLHttpRequest — JavaScript 發送 HTTP 請求 (I):https://notfalse.net/29/xmlhttprequest
XMLHttpRequest:https://developer.mozilla.org/zh-TW/docs/Web/API/XMLHttpRequest
JavaScript 初心者筆記: AJAX – 從遠端即時撈取資料:https://ithelp.ithome.com.tw/articles/10222165

Pingback: JavaScript-發送HTTP請求 XMLHttpRequest jQuery方式 AJAX - Steven玄