《AJAX:前端異步交互的魔法指南》

?

什么是AJAX

AJAX(Asynchronous JavaScript and XML,異步 JavaScript 和 XML)?是一種用于創建異步網頁應用的技術,允許網頁在不重新加載整個頁面的情況下,與服務器交換數據并局部更新頁面內容。盡管名稱中包含 XML,但現代 AJAX 主要使用 JSON(JavaScript Object Notation)作為數據格式。


核心原理

  1. 異步通信

    • 瀏覽器通過 JavaScript?異步發送請求到服務器,同時用戶可繼續操作頁面。

    • 服務器返回數據后,JavaScript 動態更新頁面指定部分,無需刷新整個頁面。

  2. 基于?XMLHttpRequest?或?Fetch API

    • 傳統 AJAX 使用?XMLHttpRequest?對象發起請求。

    • 現代開發中更常用?Fetch API(基于 Promise,語法更簡潔)。


工作流程

sequenceDiagramparticipant 用戶participant 瀏覽器participant 服務器用戶->>瀏覽器: 觸發事件(點擊、滾動等)瀏覽器->>服務器: 發送異步請求(XHR/Fetch)服務器->>瀏覽器: 返回數據(JSON/XML/HTML)瀏覽器->>用戶: 局部更新頁面內容

關鍵特點

特性說明
異步性不阻塞用戶操作,后臺完成數據交互。
無刷新更新僅更新頁面局部內容,避免整頁重載。
數據格式靈活支持 JSON、XML、HTML 或純文本。
依賴 JavaScript需瀏覽器啟用 JavaScript。
跨域限制默認受同源策略限制,需通過 CORS(跨域資源共享)或代理解決跨域問題。

  • 使用瀏覽器的 XMLHttpRequest 對象 與服務器通信

  • 瀏覽器網頁中,使用 AJAX技術(XHR對象)發起獲取省份列表數據的請求,服務器代碼響應準備好的省份列表數據給前端,前端拿到數據數組以后,展示到網頁。

什么是axios

?

Axios?是一個基于?Promise?的現代化 HTTP 客戶端庫,專為瀏覽器和 Node.js 設計,用于簡化前端與后端的數據交互。它封裝了底層 HTTP 請求細節,提供了更簡潔、易用的 API,并支持攔截器、自動 JSON 轉換、請求取消等高級功能,是替代原生?XMLHttpRequest?和?Fetch API?的流行選擇。


核心特性

特性說明
基于 Promise天然支持異步編程,避免回調地獄,可使用?async/await?簡化代碼。
瀏覽器 & Node.js 支持同一套代碼兼容瀏覽器(XHR)和 Node.js(HTTP 模塊)。
自動 JSON 轉換自動將請求/響應數據與 JSON 格式互相轉換。
攔截器機制可全局攔截請求和響應,用于添加身份驗證、日志、錯誤處理等統一邏輯。
取消請求支持主動取消未完成的請求(如用戶離開頁面時終止無用請求)。
并發請求通過?axios.all()?和?axios.spread()?處理多個并行請求。
客戶端防御 XSRF支持自動添加 XSRF Token 到請求頭,增強安全性。
超時控制可設置請求超時時間,避免長時間等待無響應。

基礎用法示例

1. 發起 GET 請求

?

import axios from 'axios';// 基本 GET 請求
axios.get('https://api.example.com/data').then(response => {console.log(response.data); // 響應數據}).catch(error => {console.error('請求失敗:', error);});// 帶參數的 GET 請求
axios.get('https://api.example.com/user', {params: {id: 123,type: 'vip'}
});

2. 發起 POST 請求

?

axios.post('https://api.example.com/login', {username: 'admin',password: '123456'
})
.then(response => {console.log('登錄成功:', response.data.token);
});

3. 并發請求

?

const getUser = axios.get('/user/123');
const getPosts = axios.get('/posts');axios.all([getUser, getPosts]).then(axios.spread((userRes, postsRes) => {console.log('用戶數據:', userRes.data);console.log('帖子數據:', postsRes.data);}));

4. 全局配置

?

// 設置全局默認值(如 API 基礎路徑)
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = 'Bearer token123';
axios.defaults.timeout = 5000; // 5秒超時

高級功能

1.?攔截器(Interceptors)

?

// 添加請求攔截器(如添加 Token)
axios.interceptors.request.use(config => {config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;return config;
}, error => {return Promise.reject(error);
});// 添加響應攔截器(如統一處理錯誤)
axios.interceptors.response.use(response => {return response.data; // 直接返回數據部分
}, error => {if (error.response.status === 401) {alert('登錄已過期,請重新登錄!');window.location.href = '/login';}return Promise.reject(error);
});

2.?取消請求

?

const source = axios.CancelToken.source();axios.get('/data', {cancelToken: source.token
}).catch(error => {if (axios.isCancel(error)) {console.log('請求被取消:', error.message);}
});// 取消請求(參數為可選提示信息)
source.cancel('用戶主動取消操作');

Axios vs Fetch API

對比項AxiosFetch API
語法簡潔性封裝度高,API 更簡潔原生 API,需手動處理更多細節
JSON 轉換自動轉換請求/響應數據需手動調用?response.json()
攔截器支持全局請求/響應攔截無內置攔截器,需自行封裝
取消請求內置支持通過?AbortController?實現
瀏覽器兼容性兼容 IE11+(需 polyfill)兼容現代瀏覽器,IE 不支持
超時控制直接通過?timeout?配置需結合?setTimeout?和?AbortController

常見問題解決

  1. 跨域請求(CORS)

    • 需后端配置?Access-Control-Allow-Origin?等響應頭。

    • 開發環境可通過代理(如 Webpack DevServer 代理)繞過。

  2. 文件上傳

    const formData = new FormData();
    formData.append('file', fileInput.files[0]);axios.post('/upload', formData, {headers: { 'Content-Type': 'multipart/form-data' }
    });

    ?

  3. 錯誤處理統一封裝
    建議通過攔截器集中處理 HTTP 狀態碼和業務錯誤碼。

什么是URL

URL(Uniform Resource Locator,統一資源定位符)?是用于標識和定位互聯網上資源(如網頁、圖片、視頻等)的字符串。它是 Web 的核心組成部分,用戶通過 URL 訪問特定資源,瀏覽器通過 URL 向服務器請求數據。


URL 的結構

一個完整的 URL 通常由以下部分組成:

?

協議://主機名:端口號/路徑?查詢參數#片段標識符

示例

?

https://www.example.com:443/path/to/resource?name=value#section1

?


    URL 的組成部分詳解

    部分說明
    協議(Scheme)指定訪問資源使用的協議,常見的有:
    -?http:超文本傳輸協議
    -?https:加密的 HTTP
    -?ftp:文件傳輸協議
    -?mailto:電子郵件地址
    主機名(Host)資源所在服務器的域名或 IP 地址,如?www.example.com
    端口號(Port)服務器監聽的端口號,默認端口可省略(如 HTTP 默認 80,HTTPS 默認 443)。
    路徑(Path)資源在服務器上的具體位置,如?/path/to/resource
    查詢參數(Query)以???開頭,包含鍵值對,用于傳遞額外信息,如??name=value&age=25
    片段標識符(Fragment)以?#?開頭,指向資源內部的特定部分(如 HTML 頁面的錨點)。

    ?URL里的查詢參數

    什么是查詢參數 ?

    • 攜帶給服務器額外信息,讓服務器返回我想要的某一部分數據而不是全部數據

    • 舉例:查詢河北省下屬的城市列表,需要先把河北省傳遞給服務器

    ?

    1. 查詢參數的語法 ?

      • 在 url 網址后面用?拼接格式:XXXX參數名1=值1&參數名2=值2

      • 參數名一般是后端規定的,值前端看情況傳遞即可

    2. axios 如何攜帶查詢參數?

      使用 params 選項即可
    axios({url: '目標資源地址',params: {參數名: 值}
    }).then(result => {// 對服務器返回的數據做后續處理
    })

    ?常用請求和數據提交

    想要提交數據,先來了解什么是請求方法

    • 請求方法是一些固定單詞的英文,例如:GET,POST,PUT,DELETE,PATCH(這些都是http協議規定的),每個單詞對應一種對服務器資源要執行的操作。

    什么時候進行數據提交呢?

    • 例如:多端要查看同一份訂單數據,或者使用同一個賬號進行登錄,那訂單/用戶名+密碼,就需要保存在服務器上,隨時隨地進行訪問

    ?axios 如何提交數據到服務器呢?

    axios({url: '目標資源地址',method: '請求方法',data: {參數名: 值}
    }).then(result => {// 對服務器返回的數據做后續處理
    })

    AXIOS的錯誤處理

    Axios 的錯誤處理?是開發中非常重要的一部分,能夠有效應對網絡請求中的各種異常情況(如網絡錯誤、服務器錯誤、超時等)。Axios 提供了多種方式來處理錯誤,包括?catch?方法、try/catch?語法(結合?async/await)以及攔截器機制。

    ?

    Axios 的錯誤對象包含以下關鍵屬性:

    • message:錯誤描述。

    • response:服務器返回的響應對象(如果有)。

      • status:HTTP 狀態碼(如 404、500)。

      • data:服務器返回的錯誤數據。

    • request:請求對象(如果請求已發出但未收到響應)。

    • config:請求的配置信息。

    示例:使用?catch?處理錯誤

    axios.get('https://api.example.com/data').then(response => {console.log('請求成功:', response.data);}).catch(error => {if (error.response) {// 服務器返回了錯誤狀態碼(4xx/5xx)console.error('服務器錯誤:', error.response.status, error.response.data);} else if (error.request) {// 請求已發出但未收到響應console.error('網絡錯誤:', error.message);} else {// 其他錯誤(如配置錯誤)console.error('請求配置錯誤:', error.message);}});
    ?

    示例:使用?async/await?處理錯誤

    async function fetchData() {try {const response = await axios.get('https://api.example.com/data');console.log('請求成功:', response.data);} catch (error) {if (error.response) {console.error('服務器錯誤:', error.response.status, error.response.data);} else if (error.request) {console.error('網絡錯誤:', error.message);} else {console.error('請求配置錯誤:', error.message);}}
    }
    ?



    表白是表明心意,不是索取關系。


    ?

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

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

    相關文章

    Python 性能優化:從入門到精通的實用指南

    Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

    利用 requestrepo 工具驗證 XML外部實體注入漏洞

    1. 前言 在數字化浪潮席卷的當下,網絡安全的重要性愈發凸顯。應用程序在便捷生活與工作的同時,也可能暗藏安全風險。XXE(XML外部實體)漏洞作為其中的典型代表,攻擊者一旦利用它,便能竊取敏感信息、掌控服務…

    FreeRTOS第17篇:FreeRTOS鏈表實現細節05_MiniListItem_t:FreeRTOS內存優化

    文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 為什么需要迷你列表項? 在嵌入式系統中,內存資源極其寶貴。FreeRTOS為滿足不同場景需求,設計了標準列表項(ListItem_…

    Spring 無法解決循環依賴的 5 種場景

    一、構造器注入引發的循環依賴 1. 問題復現 Component public class ServiceA {private final ServiceB serviceB;Autowiredpublic ServiceA(ServiceB serviceB) { // 構造器注入this.serviceB serviceB;} }Component public class ServiceB {private final ServiceA servic…

    Core Vision Kit(基礎視覺服務)

    文章目錄 一、Core Vision Kit簡介場景介紹約束與限制二、通用文字識別三、人臉檢測一、Core Vision Kit簡介 Core Vision Kit(基礎視覺服務)是機器視覺相關的基礎能力,例如通用文字識別(即OCR,Optical Character Recognition,也稱為光學字符識別)、人臉檢測、人臉比對…

    第TR3周:Pytorch復現Transformer

    🍨 本文為🔗365天深度學習訓練營中的學習記錄博客 🍖 原作者:K同學啊 Transformer通過自注意力機制,改變了序列建模的方式,成為AI領域的基礎架構 編碼器:理解輸入,提取上下文特征…

    FreeRTOS 任務間通信機制:隊列、信號量、事件標志組詳解與實驗

    1. FreeRTOS 消息隊列 1.1 簡介 ? 隊列是 任務間通信的主要形式,可用于在任務之間以及中斷與任務之間傳遞消息。隊列在 FreeRTOS 中具有以下關鍵特點: 隊列默認采用 先進先出 FIFO 方式,也可以使用 xQueueSendToFront()實現 LIFO。FreeRT…

    【虛擬化】Docker Desktop 架構簡介

    在閱讀前您需要了解 docker 架構:Docker architecture WSL 技術:什么是 WSL 2 1.Hyper-V backend 我們知道,Docker Desktop 最開始的架構的后端是采用的 Hyper-V。 Docker daemon (dockerd) 運行在一個 Linux distro (LinuxKit build) 中&…

    Unity光照之Halo組件

    簡介 Halo 組件 是一種用于在游戲中創建光暈效果的工具,主要用于模擬光源周圍的發光區域(如太陽、燈泡等)或物體表面的光線反射擴散效果。 核心功能 1.光暈生成 Halo 組件會在光源或物體的周圍生成一個圓形光暈,模擬光線在空氣…

    Flink深入淺出之01:應用場景、基本架構、部署模式

    Flink 1?? 一 、知識要點 📖 1. Flink簡介 Apache Flink — Stateful Computations over Data StreamsApache Flink 是一個分布式大數據處理引擎,可對有界數據流和無界數據流進行有狀態的計算。Flink 能在所有常見集群環境中運行,并能以…

    2025年【高壓電工】報名考試及高壓電工考試總結

    隨著電力行業的快速發展,高壓電工成為確保電力系統安全穩定運行的重要一環。為了提高高壓電工的專業技能和安全意識,“安全生產模擬考試一點通”平臺特別整理了2025年高壓電工報名考試的相關信息及考試總結,并提供了一套完整的題庫&#xff0…

    網絡HTTP

    HTTP Network Request Library A Retrofit-based HTTP network request encapsulation library that provides simple and easy-to-use API interfaces with complete network request functionality. 基于Retrofit的HTTP網絡請求封裝庫,提供簡單易用的API接口和完…

    os-copilot安裝和使用體驗測評

    簡介: OS Copilot是阿里云基于大模型構建的Linux系統智能助手,支持自然語言問答、命令執行和系統運維調優。本文介紹其產品優勢、功能及使用方法,并分享個人開發者在云服務器資源管理中的實際應用體驗。通過-t/-f/管道功能,OS Cop…

    Python Flask框架學習匯編

    1、入門級: 《Python Flask Web 框架入門》 這篇博文條理清晰,由簡入繁,案例豐富,分十五節詳細講解了Flask框架,強烈推薦! 《python的簡單web框架flask【附例子】》 講解的特別清楚,每一步都…

    【HarmonyOS Next之旅】DevEco Studio使用指南(一)

    目錄 1 -> 工具簡介 1.1 -> 概述 1.2 -> HarmonyOS應用/服務開發流程 1.2.1 -> 開發準備 1.2.2 -> 開發應用/服務 1.2.3 -> 運行、調試和測試應用/服務 1.2.4 -> 發布應用/服務 2 -> 工程介紹 2.1 -> APP包結構 2.2 -> 切換工程視圖 …

    Manus開源平替-開源通用智能體

    原文鏈接:https://i68.ltd/notes/posts/250306-opensource-agi-agent/ OWL-比Manus還強的全能開源Agent OWL: Optimized Workforce Learning for General Multi-Agent Assistance in Real-World Task Automation,現實世界中執行自動化任務的通用多代理輔助優化學習…

    【3.2-3.8學習周報】

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 摘要Abstract一、方法介紹1.任務適應性持續預訓練(TACP)2.領域自適應連續預訓練(DACP)3.ETS-DACP和ETA-DACP 二、實驗…

    【Linux】用戶和組

    思考 使用useradd在Linux下面創建一個用戶,默認情況下,會自動創建一個同名組,并且加入其中,那么是先創建用戶呢?還是先創建組呢? 很簡單,我們實踐一下不就知道了,如下所示&#xff…

    新編大學應用英語綜合教程2 U校園全套參考答案

    全套答案獲取: 鏈接:https://pan.quark.cn/s/389618f53143

    SAP 顧問的五年職業規劃

    SAP 顧問的職業發展受到技術進步、企業需求變化和全球經濟環境的影響,因此制定長遠規劃充滿挑戰。面對 SAP 產品路線圖的不確定性,如向 S/4HANA 和 Business Technology Platform (BTP) 的轉變,顧問必須具備靈活性,以保持競爭力和…