JavaScript HTTP 請求:從老古董到新潮流

前端開發離不開跟后端打交道,HTTP 請求就是這座橋梁。JavaScript 提供了好幾種方式來發請求,從老牌的 XMLHttpRequest (XHR) 到現代的 Fetch API,再到各種好用的第三方庫(像 Axios、Ky、Superagent)。咱們一個一個聊清楚,帶代碼示例,講講優缺點和實際場景,最后再看看未來趨勢。


1. XMLHttpRequest (XHR):老大哥還在用

1.1 啥是 XHR?

XHR 是瀏覽器內置的 API,最早微軟在 IE5 搞出來的,后來成了 Web 標準。雖然現在 Fetch 更時髦,但 XHR 在老項目或者需要兼容古老瀏覽器的場景里還挺常見。

1.2 特點

  • 異步支持:可以異步發請求,通過事件監聽處理結果。
  • 靈活:支持 GET、POST、PUT 等方法,能處理 JSON、文件、甚至二進制數據。
  • 兼容性:幾乎所有瀏覽器(包括 IE)都支持。
  • 缺點:代碼寫起來有點繁瑣,回調風格容易搞成“回調地獄”。

1.3 怎么用?

來看個簡單的 GET 請求:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true); // true 表示異步
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log(JSON.parse(xhr.responseText)); // 成功拿到數據} else if (xhr.readyState === 4) {console.error('出錯了:', xhr.statusText); // 錯誤處理}
};
xhr.onerror = function () {console.error('網絡掛了'); // 網絡錯誤
};
xhr.send();

1.4 POST 請求

如果要發 POST 請求,比如提交個表單數據:

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/submit', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log('成功:', JSON.parse(xhr.responseText));} else if (xhr.readyState === 4) {console.error('出錯了:', xhr.statusText);}
};
const data = JSON.stringify({ name: '小明', age: 25 });
xhr.send(data);

1.5 高級點玩法

  • 超時xhr.timeout = 5000 設置 5 秒超時。
  • 進度監聽:用 xhr.onprogress 監聽大文件上傳/下載進度。
  • 取消請求xhr.abort() 直接干掉請求。

1.6 優缺點

  • 優點:原生支持,兼容性無敵,能監聽進度。
  • 缺點:代碼啰嗦,回調太多,現代項目用起來有點老土。

2. Fetch API:現代前端的標配

2.1 啥是 Fetch?

Fetch 是瀏覽器的新 API,2015 年開始推廣,基于 Promise 設計,寫起來比 XHR 清爽多了。現在基本是前端發請求的首選。

2.2 特點

  • Promise 風格:支持 async/await,代碼簡潔。
  • 流式處理:可以用 ReadableStream 處理大文件。
  • 現代化:API 設計直觀,配置簡單。
  • 缺點:不會自動拋 HTTP 錯誤(像 404、500),得自己檢查;不支持進度事件。

2.3 基本用法

簡單的 GET 請求:

fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error(`HTTP 錯誤! 狀態碼: ${response.status}`);}return response.json();}).then(data => console.log(data)).catch(error => console.error('出錯了:', error));

用 async/await 更清爽:

async function fetchData() {try {const response = await fetch('https://api.example.com/data');if (!response.ok) {throw new Error(`HTTP 錯誤! 狀態碼: ${response.status}`);}const data = await response.json();console.log(data);} catch (error) {console.error('出錯了:', error);}
}
fetchData();

2.4 POST 請求

發個 POST 請求:

async function postData() {try {const response = await fetch('https://api.example.com/submit', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ name: '小明', age: 25 }),});if (!response.ok) {throw new Error(`HTTP 錯誤! 狀態碼: ${response.status}`);}const data = await response.json();console.log('成功:', data);} catch (error) {console.error('出錯了:', error);}
}
postData();

2.5 高級玩法

  • 流式處理:處理大文件或流式數據:
    async function streamData() {const response = await fetch('https://api.example.com/stream');const reader = response.body.getReader();const decoder = new TextDecoder();while (true) {const { done, value } = await reader.read();if (done) break;console.log(decoder.decode(value));}
    }
    
  • 取消請求:用 AbortController
    const controller = new AbortController();
    fetch('https://api.example.com/data', { signal: controller.signal }).then(response => response.json()).then(data => console.log(data)).catch(error => console.error('出錯了:', error));
    setTimeout(() => controller.abort(), 3000); // 3秒后取消
    

2.6 優缺點

  • 優點:語法簡潔,Promise 好用,支持流式處理,跟現代 JS 配合天衣無縫。
  • 缺點:得手動檢查 HTTP 狀態碼,IE 不支持,沒進度事件。

3. 熱門請求庫:省心省力

原生的 XHR 和 Fetch 雖然好,但有時候寫起來還是麻煩。第三方庫把這些都封裝得更簡單,下面聊聊幾個 2025 年還很火的庫。

3.1 Axios:萬金油選擇

啥是 Axios?
Axios 是最流行的 HTTP 客戶端,支持瀏覽器和 Node.js,基于 Promise,功能強大,社區活躍。

特點

  • 自動轉 JSON 數據。
  • 支持請求/響應攔截器(比如加 token)。
  • 支持取消請求、超時。
  • 兼容性好,連 IE 都支持。
  • GitHub Star(2025 年):大概 100k+。

基本用法

import axios from 'axios';async function fetchWithAxios() {try {const response = await axios.get('https://api.example.com/data');console.log(response.data);} catch (error) {console.error('出錯了:', error.message);}
}// POST 請求
async function postWithAxios() {try {const response = await axios.post('https://api.example.com/submit', {name: '小明',age: 25,});console.log('成功:', response.data);} catch (error) {console.error('出錯了:', error.message);}
}

攔截器(超實用):

axios.interceptors.request.use(config => {config.headers.Authorization = `Bearer ${token}`;return config;
});axios.interceptors.response.use(response => response,error => {console.error('全局錯誤:', error);return Promise.reject(error);}
);

優點

  • API 簡單,功能全。
  • 支持全局配置,適合大項目。
  • 自動處理 HTTP 錯誤。

缺點

  • 得引入庫,增加點體積(壓縮后 ~20KB)。
  • 小項目可能用不上這么多功能。

3.2 Ky:輕量又時髦

啥是 Ky?
Ky 是基于 Fetch 的輕量庫,專為現代瀏覽器設計,API 優雅,體積小。

特點

  • 基于原生 Fetch,無需 polyfill。
  • API 直觀,比如 ky.get().json()
  • 體積超小(壓縮后 ~5KB)。
  • 支持超時、重試、JSON 自動解析。

基本用法

import ky from 'ky';async function fetchWithKy() {try {const data = await ky.get('https://api.example.com/data').json();console.log(data);} catch (error) {console.error('出錯了:', error);}
}// POST 請求
async function postWithKy() {try {const data = await ky.post('https://api.example.com/submit', {json: { name: '小明', age: 25 },}).json();console.log('成功:', data);} catch (error) {console.error('出錯了:', error);}
}

重試機制

const data = await ky.get('https://api.example.com/data', {retry: 3,timeout: 5000,
}).json();

優點

  • 超輕量,API 優雅,適合小項目。
  • 學習成本低,現代瀏覽器完美支持。

缺點

  • 不支持 IE。
  • 功能比 Axios 簡單點,攔截器支持有限。

3.3 Superagent:鏈式調用很酷

啥是 Superagent?
Superagent 是個輕量 HTTP 客戶端,支持瀏覽器和 Node.js,鏈式調用風格很獨特,適合快速上手。

特點

  • 鏈式 API(像 .get().query())。
  • 支持文件上傳、超時、認證。
  • 體積適中(壓縮后 ~15KB)。

基本用法

import request from 'superagent';async function fetchWithSuperagent() {try {const response = await request.get('https://api.example.com/data');console.log(response.body);} catch (error) {console.error('出錯了:', error.message);}
}// POST 請求
async function postWithSuperagent() {try {const response = await request.post('https://api.example.com/submit').send({ name: '小明', age: 25 });console.log('成功:', response.body);} catch (error) {console.error('出錯了:', error.message);}
}

優點

  • 鏈式調用寫起來爽,代碼可讀性高。
  • 支持多種數據格式。

缺點

  • 社區沒 Axios 活躍。
  • 功能比 Axios 少點。

3.4 其他好用的

  • SWR:React 專用的數據獲取庫,帶緩存,超適合動態數據場景。
    import useSWR from 'swr';
    const fetcher = url => fetch(url).then(res => res.json());
    const { data, error } = useSWR('https://api.example.com/data', fetcher);
    
  • React Query (TanStack Query):復雜應用的利器,數據同步和狀態管理一流。
  • Alova:新興庫,支持請求策略(緩存、重試),跟 Vue/React 配合好。

4. 對比:選哪個好?

工具原生?Promise?體積攔截器流式處理取消請求兼容性適合場景
XHR無需引入不支持支持支持超強(包括 IE)老項目、兼容性要求高
Fetch無需引入不支持支持支持現代瀏覽器現代 Web 開發
Axios~20KB支持不支持支持超強(包括 IE)企業級、復雜需求
Ky~5KB有限支持支持現代瀏覽器輕量項目、現代瀏覽器
Superagent~15KB有限不支持支持快速開發、中小型項目

選啥?

  • 小項目:Fetch 或 Ky,簡單輕量。
  • 大項目:Axios,功能全,省心。
  • React 項目:SWR 或 React Query,數據管理更方便。
  • 兼容 IE:用 XHR 或 Axios。
  • Web3/實時:Fetch 配合 WebSocket 更靈活。

5. 實戰:寫個請求工具類

下面是個基于 Fetch 和 Axios 的工具類,方便復用,支持 GET、POST、錯誤處理和超時:

class HttpClient {constructor(baseURL) {this.baseURL = baseURL;this.axiosInstance = axios.create({baseURL,timeout: 10000,});}async fetchRequest(method, url, data = null, options = {}) {try {const response = await fetch(`${this.baseURL}${url}`, {method,headers: {'Content-Type': 'application/json',...options.headers,},body: data ? JSON.stringify(data) : null,...options,});if (!response.ok) {throw new Error(`HTTP 錯誤! 狀態碼: ${response.status}`);}return await response.json();} catch (error) {console.error('Fetch 出錯了:', error);throw error;}}async axiosRequest(method, url, data = null) {try {const response = await this.axiosInstance({ method, url, data });return response.data;} catch (error) {console.error('Axios 出錯了:', error.message);throw error;}}get(url, options = {}) {return this.fetchRequest('GET', url, null, options);}post(url, data, options = {}) {return this.fetchRequest('POST', url, data, options);}axiosGet(url) {return this.axiosRequest('get', url);}axiosPost(url, data) {return this.axiosRequest('post', url, data);}
}// 用法
const client = new HttpClient('https://api.example.com');async function main() {try {const fetchData = await client.get('/data');console.log('Fetch GET:', fetchData);const axiosData = await client.axiosPost('/submit', { name: '小明' });console.log('Axios POST:', axiosData);} catch (error) {console.error('出錯了:', error);}
}
main();

6. 注意事項

  1. 錯誤處理:Fetch 不會自動拋 404、500,得自己檢查;Axios 自動拋。
  2. 超時:Fetch 用 AbortController,Axios 直接配 timeout
  3. 安全
    • 用 HTTPS,防止數據泄露。
    • 正確設置 Content-TypeAccept 頭。
    • 防 XSS/CSRF,檢查 CORS 配置。
  4. 性能
    • 用 SWR 或瀏覽器 Cache API 緩存數據。
    • 壓縮請求體(比如 Gzip)。
    • 用 CDN 加速靜態資源。
  5. 調試
    • 瀏覽器 DevTools 的 Network 面板。
    • Postman 或者 Insomnia 測試 API。
    • Axios 的攔截器可以打日志。

7. 未來趨勢

  • GraphQL:越來越多人用 GraphQL 替代 REST,推薦 Apollo Client 或 urql。
  • Server Components:React 19 和 Next.js 15 的服務器組件減少客戶端請求,性能更好。
  • WebTransport:新 API,可能取代部分 HTTP 請求,延遲更低。
  • AI 輔助:AI 工具(像 Vercel 的 v0)可能自動生成請求代碼,優化 API 調用。

8. 總結

  • XHR:老項目或兼容 IE 用,代碼有點煩。
  • Fetch:現代標配,Promise 和流式處理很強,但得手動處理錯誤。
  • Axios:大項目首選,功能全,社區強。
  • Ky:小項目利器,輕量又好用。
  • Superagent:鏈式調用爽,適合快速開發。

根據項目需求選工具:小項目用 Fetch/Ky,大項目選 Axios,React 開發試試 SWR 或 React Query。想動手試試?可以拿上面的工具類改改,調個公開 API(比如 JSONPlaceholder)練練手!

點個收藏,關注前端結城,一起用代碼點亮前端世界!🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90972.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows10系統使用Cmake4.1.0構建工具+Visual Studio2022編譯Opencv4.11教程

安裝提示 后續安裝本Cmake和Opencv版本及以上都可以。Microsoft Visual Studio2022已默認安裝,沒有安裝給出教程鏈接。 一、Cmake4.1.0下載 1.官網下載:https://cmake.org/download/,找到cmake-4.1.0-rc3-windows-x86_64.zip版本 2.壓縮包…

【性能測試】Jmeter+Grafana+InfluxDB+Prometheus Windows安裝部署教程

一、工具作用與整體架構 1.1 各工具核心作用 工具作用描述關鍵特性Jmeter性能測試工具,模擬多用戶并發請求,生成測試數據支持HTTP/HTTPS、數據庫等多種協議,可自定義測試場景InfluxDB時序數據庫,專門存儲時間序列數據&#xff0…

【Kubernetes】使用Deployment進行的資源調度,資源清理,伸縮與更新管控

Kubernetes Deployment 實戰:從資源清理到伸縮與更新管控 一、基礎準備:清理閑置 ReplicaSet 在使用 Deployment 時,每次更新都會生成新的 ReplicaSet(簡稱 RS),舊的 RS 會被保留但設置為 DESIRED0。這些閑…

stm32使用USB虛擬串口,因電腦缺少官方驅動而識別失敗(全系列32單片機可用)

驅動下載地址 官網地址:https://www.st.com/en/development-tools/stsw-stm32102.html

枚舉中間位置基礎篇

參考資料來源靈神在力扣所發的題單,僅供分享學習筆記和記錄,無商業用途。 核心思路: 一:直接直接用數據結構記錄需要的數據,在枚舉右,維護左的循環中,刪除當前位置的元素即可達成一樣效果 二…

企業選擇將服務器放在IDC機房托管的優勢

在服務器作為數據存儲和傳輸的核心設備的社會環境中,服務器的穩定性和安全性會直接影響到企業業務的連續性和用戶的滿意程度,隨著云計算技術和大數據的興起,企業對于服務器的需求也在日益增加,而如何高效、安全的管理服務器則是各…

自動化UI測試工具TestComplete的AI雙引擎:即時數據集 + 自愈測試

隨著敏捷開發和持續交付模式的普及,傳統的軟件測試方法正面臨著前所未有的挑戰。測試團隊在追求快速迭代的同時,往往陷入測試數據準備和測試維護的泥潭,嚴重制約了交付效率和質量保障能力。 TestComplete作為業界領先的自動化測試工具&#…

用KNN實現手寫數字識別:基于 OpenCV 和 scikit-learn 的實戰教學 (超級超級超級簡單)

用KNN實現手寫數字識別:基于 OpenCV 和 scikit-learn 的實戰教學在這篇文章中,我們將使用 KNN(K-Nearest Neighbors)算法對手寫數字進行分類識別。我們會用 OpenCV 讀取圖像并預處理數據,用 scikit-learn 構建并訓練模…

數據結構自學Day15 -- 非比較排序--計數排序

一、計數排序(Counting Sort)計數排序是一種非比較型的排序算法,它的核心思想是:利用“元素的值”來確定它在結果數組中的位置,通過“統計每個數出現的次數”來完成排序。二、如何實現計數排序(核心步驟&am…

k8s的權限

來自博客:25-k8s集群中-RBAC用戶角色資源權限_權限 資源 角色-CSDN博客 一.RBAC概述(基于角色的訪問控制) 1.圖解 用戶: 1.user 2.serviceAccount 3.Group 用戶角色 1.Role:局部資源角色 2.clusterRole:全局資源角色額 角色綁…

C++ - 仿 RabbitMQ 實現消息隊列--服務端核心模塊實現(三)

目錄 隊列數據管理 代碼實現 測試代碼 綁定信息(交換機-隊列)管理 代碼實現 測試代碼 隊列數據管理 當前隊列數據的管理,本質上是隊列描述信息的管理,描述當前服務器上有哪些隊列。 定義隊列描述數據類 隊列名稱是否持久化標志是否獨占標志是否自…

51c自動駕駛~合集9

自己的原文哦~ https://blog.51cto.com/whaosoft/11627386 #端到端1 說起端到端,每個從業者可能都覺得會是下一代自動駕駛量產方案繞不開的點!特斯拉率先吹響了方案更新的號角,無論是完全端到端,還是專注于planner的模…

時間長了忘記jupyter的環境是哪個了

有這些但是忘記是哪個了jupyter kernelspec list查看內核路徑,這個內核是用來告訴jupyter 去哪找內核配置的到這個路徑下打開json文件查看使用的python環境從而確定是哪個conda環境為jupyter使用的python環境jupyter的工作原理:在創建conda環境后會安裝j…

PYTHON從入門到實踐-15數據可視化

數據可視化是數據分析中不可或缺的一環,它能夠將抽象的數據轉化為直觀的圖形,幫助我們更好地理解數據特征和發現潛在規律。本文將介紹如何使用Python中的Matplotlib和Plotly庫進行數據可視化,并通過擲骰子的概率模擬案例展示可視化的實際應用…

Spring IOC 容器 **默認注冊 Bean** 的 8 條規則

Spring IOC 容器 默認注冊 Bean 的 8 條規則 (Spring Framework 6.x 源碼級總結)閱讀提示:把下面 8 條規則背下來,再讀 Spring 源碼時,你會在任何一行代碼里立刻知道「這個 BeanDefinition 是從哪兒來的」。1?? 環境…

29.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--用戶配置服務

用戶配置服務是孢子記賬中最簡單的部分。簡單說,用戶配置服務就是用戶自定義的配置項存儲服務,用于我們的APP根據用戶的配置實現指定的功能。它提供了一個簡單的接口,允許用戶存儲和檢索他們的配置數據。就目前來說,用戶配置只有一…

Python實現PDF按頁分割:靈活拆分文檔的技術指南

Python實現PDF按頁分割:靈活拆分文檔的技術指南 PDF文件處理是日常工作中的常見需求,特別是當我們需要將大型PDF文檔拆分為多個部分時。本文將介紹如何使用Python創建一個靈活的PDF分割工具,能夠根據用戶指定的頁數范圍任意分割文檔。 需求分…

「iOS」——GCD其他方法詳解

GCD學習GCD其他方法dispatch_semaphore (信號量)**什么是信號量**dispatch_semaphore主要作用dispatch_semaphore主要作用異步轉同步設置一個最大開辟的線程數加鎖機制dispatch_time_t 兩種形式GCD一次性代碼(只執行一次)dispatch_barrier_async/sync柵欄…

【圖像處理基石】如何實現一個車輛檢測算法?

基于AI的車牌檢測和識別算法 問題描述、應用場景與難點 問題描述 車牌檢測和識別是計算機視覺領域的一個特定任務,主要包含兩個核心步驟: 車牌檢測:從圖像中準確定位車牌的位置和區域車牌識別:對檢測到的車牌區域進行字符識別&…

計算機學報 2025年 區塊鏈論文 錄用匯總 附pdf下載

計算機學報 Year:2025 2024請看 1 Title: 基于區塊鏈的動態多云多副本數據完整性審計方法研究 Authors: Key words: 區塊鏈;云存儲;多云多副本存儲;數據完整性審計 Abstract: 隨著云計算技術的快速發展和云存儲服務的日益…