當前位置: 妍妍網 > 碼農

XHR 與 Fetch,面試官的「小心機」!!!

2024-03-11碼農

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心~

現如今,網站開發普遍采用前後端分離的模式,數據互動成為了不可或缺的關鍵環節。在這個過程中, XHR Fetch API 是兩種最常見的方法,用於從 Web 伺服器獲取數據。 XHR 是一種傳統的數據請求方式,而 Fetch API 則代表了現代 Web 開發的新興標準。接下來,我們將一同深入學習它們的使用方法和適用場景。

XMLHttpRequest

XMLHttpRequest ,通常簡稱為 XHR。透過 XMLHttpRequest 可以在不重新整理頁面的情況下請求特定 URL,獲取數據。XMLHttpRequest 在 AJAX 編程中(比如 jquery)被大量使用。

AJAX :異步 JavaScript 和 XML。許多人容易把它和 jq 的 ajax 混淆。它是一個技術統稱,本身不是一種技術。

特點

  1. 異步請求 :XHR 允許進行異步請求,它可以在後台執行,而不會阻止頁面的其他操作。

  2. 支持跨域請求 :透過伺服器端設定允許跨域請求,從不同域的伺服器獲取數據。

  3. 事件驅動 :提供了 onload onerror onprogress 等一系列事件來監聽請求的狀態變化。

  4. 靈活性 :提供了對請求頭、響應頭以及請求方法的完全控制,使其非常靈活。

工作原理

XHR 的工作原理主要為:

  1. 建立 XHR 物件例項:透過 new XMLHttpRequest() 建立一個 XHR 物件。

  2. 配置請求:使用 open() 方法設定請求方法(GET、POST 等)、URL,以及是否要異步執行請求。

  3. 設定回呼函式:設定事件處理常式來處理請求完成、成功、失敗等不同的狀態。

  4. 發起請求:使用 send() 方法發送請求。

  5. 處理響應:在事件處理常式中處理響應數據,通常使用 responseText responseXML 來存取響應內容。

// 建立一個新的XHR物件
const xhr = new XMLHttpRequest();
// 配置請求
xhr.open("GET""https://api.baidu.com/test"true);
// 設定響應處理常式
xhr.onload = function() {
if (xhr.status === 200) {
// 請求成功
const responseData = xhr.responseText;
console.log("成功獲取數據:", responseData);
else {
// 請求失敗
console.error("請求失敗,狀態碼:" + xhr.status);
}
};
// 發起請求
xhr.send();

XHR 的響應處理通常在 onreadystatechange 事件處理常式中完成。在上面的例子中,我們等待 XHR 物件的狀態變為 4 (表示請求完成)並且 HTTP 狀態碼為 200 (表示成功響應)時,解析響應數據。

Fetch API

Fetch 是一種現代的數據網路請求 API,它旨在解決 XHR 的一些問題,提供了更強大、更靈活的方式來處理 HTTP 請求。可以理解為 XMLHttpRequest 的升級版。

特點

  1. Promise 風格 :Fetch API 使用 Promise 物件來處理異步請求,使程式碼更具可讀性和可維護性。

  2. 更簡單的語法 :相較於 XHR,Fetch API 的語法更加簡單明了,通常只需要幾行程式碼來完成請求。

  3. 預設不接受跨域請求 :為了安全性,Fetch API 預設不接受跨域請求,但可以透過 CORS (跨域資源共享)來進行配置。

  4. 更現代的架構 :Fetch API 是建立在 Promise Stream 之上的,支持更靈活的數據處理和流式傳輸。

工作原理

Fetch 的工作原理主要為:

  1. 使用 fetch() 函式建立請求:傳入要請求的 URL,以及可選的配置參數,例如請求方法、請求頭等。

  2. 處理響應: fetch() 返回一個 Promise,您可以使用 .then() 鏈式呼叫來處理響應數據,例如使用 .json() 方法解析 JSON 數據或 .text() 方法獲取文本數據。

  3. 錯誤處理:您可以使用 .catch() 方法來捕獲任何請求或響應的錯誤。

  4. 使用 async/await :如果需要,您還可以使用 async/await 來更清晰地處理異步操作。

Fetch API 的特性和簡單的語法使它在許多前端計畫中成為首選工具。然而,它也有一些限制,例如不支持同步請求,因此需要謹慎使用。

fetch("https://api.baidu.com/test")
.then(response => {
if (!response.ok) {
thrownewError("請求失敗,狀態碼:" + response.status);
}
return response.json();
})
.then(data => {
// 請求成功,處理響應數據
console.log("成功獲取數據:", data);
})
.catch(error => {
// 請求失敗,處理錯誤
console.error(error);
});

XHR 和 Fetch 的對比

XHR 和 Fetch 都用於進行 HTTP 請求,但它們之間存在一些關鍵區別:

  • 語法: Fetch 使用 Promise,更直觀和易於理解。

  • 跨域請求: Fetch 在跨域請求方面更靈活,支持 CORS。

  • 流式傳輸: Fetch 支持可讀流,適用於大檔下載。

  • 維護性: Fetch 更容易維護和擴充套件。

  • 常用庫和外掛程式

    基於 XHR 封裝的庫

  • jquery :一個 JavaScript 庫,提供了用於處理 DOM 操作、事件處理和 XHR 請求的便捷方法。

  • axios :一個流行的 HTTP 請求庫,基於 XHR 開發,支持瀏覽器和 Node.js。

  • 基於 fetch 封裝的庫

  • redaxios :它具有與 axios 類似的 API,但更輕量級且適用於現代 Web 開發。

  • umi-request :由 Umi 框架維護的網路請求庫,提供了強大的攔截器、中介軟體和數據轉換功能。

  • 總結

    XMLHttpRequest (XHR) 和 Fetch API 都是前端開發中用於進行數據請求的有力工具。XHR 在傳統計畫中仍然有用,而 Fetch API 則在現代 Web 開發中越來越流行。具體選擇哪個工具取決於計畫的需求和開發團隊的偏好,希望本文對你有幫助!

    作者:王絕境 https://juejin.cn/post/7295551704816189467

    結語

    我是林三心

  • 一個待過 小型toG型外包公司、大型外包公司、小公司、潛力型創業公司、大公司 的作死型前端選手;

  • 一個偏前端的全幹工程師;

  • 一個不正經的金塊作者;

  • 逗比的B站up主;

  • 不帥的小紅書博主;

  • 喜歡打鐵的籃球菜鳥;

  • 喜歡歷史的乏味少年;

  • 喜歡rap的五音不全弱雞如果你想一起學習前端,一起摸魚,一起研究簡歷最佳化,一起研究面試進步,一起交流歷史音樂籃球rap,可以來俺的摸魚學習群哈哈,點這個,有7000多名前端小夥伴在等著一起學習哦 -->

  • 廣州的兄弟可以約飯哦,或者約球~我負責打鐵,你負責進球,謝謝~