在了解ajax和axios之前,我們先觀察一下他們是什么英文的縮寫
ajax 的名字為 asynchroanous JavaScript and XML
而axios的名稱來源于英文單詞“axis”與“I/O”的結合,并非直接縮寫自某個特定短語。
先導知識
在本文我們簡單的介紹一下ajax后著重講解axios,在平時工作中因為ajax配置較為底層,代碼相對冗長,所以我們使用更為現代化的axios
Axios是一個基于Promise的HTTP客戶端庫,專為瀏覽器和Node.js設計。其優勢包括:
- 簡潔的API設計,支持Promise鏈式調用。
- 自動轉換JSON數據,攔截請求和響應。
- 提供取消請求、超時控制等高級功能。
到底什么是基于promise?請看一下博主的上一篇文章Javascript異步代碼處理-CSDN博客
我們在這里簡單的介紹一下:Promise是JavaScript中用于處理異步操作的編程構造。它表示一個異步操作的最終完成(成功或失敗)及其結果值。最重要的是理解異步操作。
還有一個重點需要了解的是HTTP請求,此知識在各大網站均可搜到淺談HTTP中Get、Post、Put與Delete的區別_聯想如何跳過聯網-CSDN博客,先確保自己了解清楚后再開始axios的學習。
在傳統的網頁開發中,每次我們點擊一個鏈接或按鈕跳轉到另一個頁面時,瀏覽器會重新加載整個頁面。這個過程會出現短暫的白屏現象(頁面內容完全空白),這是因為瀏覽器正在等待從服務器加載新的頁面內容。
為了改善這種用戶體驗,開發者通常會嘗試優化網絡傳輸速度,比如壓縮資源文件、使用緩存、開啟CDN等方式來減少白屏時間。但無論我們怎么優化網絡傳輸,總還會有一個過程是“清空頁面 → 加載新頁面”,這就不可避免地會出現白屏。
另外,傳統的網頁更新方式也存在一個效率問題:哪怕只需要更改頁面上的一小部分內容,也必須整個頁面重新加載。這不僅浪費資源,也讓用戶等待的時間變長。
在構建現代web項目的時候,前端與后端之間親密的數據交互是重要的核心環節。而我們就是采用AJAX技術來實現這種數據交互的過程的。雖然瀏覽器本身已經提供了XMLHttpRequest和fetch()等等方式,但是他們或多或少存在復雜,兼容性不一等等的問題。
于是我們采用一個更強大,更友好,更靈活的AJAX封裝庫--Axios
在開始之前我們先了解如何引入axios在我們的項目中
如果你用的是前端構建工具(如 Vite、Webpack、Vue CLI):
npm install axios? 或者 yarn add axios
CDN 引入(適合純 HTML 頁面):
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
引入后,請你記住,我們引入axios的目的就是來實現異步請求的,異步就是異步,請求有很多種。
同步
在了解異步之前我們先學習一下什么是同步,我們并不舉一些生活的例子,直接使用代碼方面的解釋什么是同步:代碼按順序一行一行執行,每一行都必須等上一行執行完成后才能繼續執行下一行。
console.log('1');
console.log('2');
console.log('3');
代碼輸出結果只能是123,而不會是其他情況
異步
現在我們考慮一下異步,在異步模式中,某些操作不會立即完成(比如網絡請求、定時器等),它們會先掛起或排隊等待執行,程序會繼續執行后面的代碼,而不是等待異步操作完成。
console.log('開始模擬請求');
? ? setTimeout(()=>{
? ? ? ? console.log('請求中')
? ? },2000)
? ? console.log('請求已經發送');
考慮這段代碼,按照我們初學者所想,輸出結果就應該是 開始模擬請求->請求中->請求已經發送
但下面控制臺輸出結果并非如此。
關鍵就在于:setTimeout
是異步的。
-
當 JavaScript 執行到
setTimeout
時,它不會等里面的代碼執行完再往下走。 -
它會將回調函數(
console.log('請求中')
)注冊到“任務隊列”中,然后繼續執行后面的代碼。 -
等到 定時器時間到了(這里是2秒),并且主線程空閑時,那個回調才會執行。
到這里我們已經理解了異步的核心思想
異步就是:你啟動了一件任務,但不會等它完成才做下一件事。它不會“阻塞”后續代碼的執行,而是“等你有空再處理這件事”。
Axios
上文講到引入axios是完成異步請求的,我們異步已經搞明白了,現在我們來仔細分析一下請求
我們使用axios請求,其實是瀏覽器在背后通過HTTP協議向服務器發送請求并等待響應
包括以下兩個核心部分:
請求(Request): 你告訴服務器我要什么
響應(Response):服務器告訴你這是你要的內容
常見的請求類型(也叫“方法”)有這些:
方法 | 用途 | 示例 |
---|---|---|
GET | 獲取數據 | 獲取文章、用戶信息等 |
POST | 發送數據(新增) | 提交表單、注冊用戶等 |
PUT | 更新數據 | 修改用戶資料等 |
PATCH | 部分更新數據 | 修改一個字段 |
DELETE | 刪除數據 | 刪除評論、記錄等 |
我們現在用一個簡單的文章小系統來了解Axios的基礎用法(請注意我們不會把代碼一股腦全考上來,也不會實打實就寫代碼,而是通過這個項目的流程來熟悉一下axios而已)
我們要構建一個簡單的“文章管理系統”,包含以下功能:
-
?獲取文章列表
-
?發布新文章
-
?修改已有文章
-
?刪除文章
這些功能剛好對應 Axios 中最常用的四種請求方法:GET、POST、PUT、DELETE。
先說白了,get從哪里get,又post到哪里
-
get
是從 服務器的某個接口(URL) 請求數據 -
post
是把數據 發送到服務器的某個接口(URL)
而這個時候API接口文檔就顯得十分重要了
Restful API 接口規范詳解-騰訊云開發者社區-騰訊云
我們可以使用 json-server
快速搭建本地 REST API
1. 安裝 json-server
npm install -g json-server
?2. 創建模擬數據 db.json
在你的項目根目錄創建一個文件:db.json
?3. 啟動服務
json-server --watch db.json --port 3000
它會自動創建出一組 完整的 RESTful 接口:
功能 | 請求方法 | 地址 |
---|---|---|
獲取所有文章 | GET | http://localhost:3000/posts |
獲取指定文章 | GET | http://localhost:3000/posts/1 |
添加文章 | POST | http://localhost:3000/posts |
修改文章 | PUT | http://localhost:3000/posts/1 |
刪除文章 | DELETE | http://localhost:3000/posts/1 |
4. 示例代碼:使用 Axios 測試
axios.get('http://localhost:3000/posts') // 獲取文章 axios.post('http://localhost:3000/posts', { title: '測試文章', content: '這是一個模擬添加的文章' });
Axios基本語法學習/復習
了解基本語法之前我們需要學習headers、params,也就是請求頭和請求體的內容
語法形式(通用)
axios(config) axios({method: 'get', ? ? ? // 請求方法(get/post/put/delete)url: '/api/posts', ? // 請求地址params: { id: 1 }, ? // URL 查詢參數(自動拼接成 ?id=1)data: { title: '標題' }, // 請求體數據(POST/PUT 用)headers: { 'X-Custom': 'value' }, // 自定義請求頭timeout: 5000 ? ? ? ?// 超時設置(單位毫秒) })
各方法語法和參數
1. axios.get(url, config)
-
url:請求地址
-
config:配置對象(headers、params 等)
axios.get('/api/posts', {params: { id: 1 },headers: { Authorization: 'Bearer token' } });
2. axios.post(url, data, config)
-
url:請求地址
-
data:請求體(body)內容
-
config:附加配置
axios.post('/api/posts', {title: '新文章',content: '內容' });
3. axios.put(url, data, config)
axios.put('/api/posts/1', {title: '修改標題' });
4. axios.delete(url, config)
axios.delete('/api/posts/1');
5. axios.patch(url, data, config)
用于局部更新資源
axios.patch('/api/posts/1', {title: '只修改標題' });
返回值:Axios 響應結構
Axios 所有請求都會返回一個 Promise,你可以用 .then()
處理返回值:
axios.get('/api/posts/1').then(response => {console.log(response.data); ? ? ? // 服務器返回的數據console.log(response.status); ? ? // 狀態碼,如 200console.log(response.headers); ? ?// 響應頭console.log(response.config); ? ? // 請求配置信息}).catch(error => {console.error(error.response); ? ?// 錯誤響應對象});
Axios 特性匯總
特性 | 說明 |
---|---|
基于 Promise | 支持鏈式調用、async/await 使用 |
自動 JSON 轉換 | 自動將請求數據轉為 JSON,也自動解析響應 JSON |
默認 GET 請求 | 默認 method 是 get ,除非你設置為 post 等 |
跨瀏覽器兼容性強 | 能在所有主流瀏覽器中使用 |
支持請求/響應攔截器 | 可在請求發出前或收到響應后處理邏輯 |
取消請求 | 支持 CancelToken 取消請求 |
防止 XSRF 攻擊 | 自動從 Cookie 獲取 token 設置到請求頭 |
統一配置 | 可通過 axios.create() 創建實例統一配置 |