1.8 axios詳解

Axios的定義與核心特性

Axios是一個基于Promise的現代化HTTP客戶端庫,主要用于在瀏覽器和Node.js 環境中發送HTTP請求,旨在簡化異步數據交互流程。其核心特性如下:

  • 跨平臺支持:在瀏覽器中通過XMLHttpRequest對象發送請求,在Node.js 環境中使用http模塊發送請求。
  • Promise API:所有請求均返回Promise對象,支持async/await語法,簡化異步代碼邏輯。
  • 自動數據轉換:默認自動將請求和響應數據轉換為JSON格式,也支持自定義轉換規則。
  • 攔截器機制:可攔截請求和響應,用于添加認證頭、統一錯誤處理等。
  • 安全性增強:客戶端支持防御XSRF(跨站請求偽造),通過在請求中攜帶Cookie中的令牌驗證請求合法性。

Axios的基本使用方法

引入Axios

使用Axios前需先引入其JS文件,可通過本地文件或CDN方式引入。例如本地引入:

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

發送HTTP請求

Axios支持多種請求方式,核心通過axios(config)方法配置請求參數,常用請求方式及示例如下:

  • GET請求:用于獲取數據,參數需拼接到URL后。
axios({ method: 'get', url: 'http://example.com/api/employees'  // 可添加參數:url: 'http://example.com/api/employees?id=1'  
}).then(result => { console.log(result.data);  // 響應數據存儲在result.data 中 
}); 

  • POST請求:用于提交數據,參數通過data屬性傳遞。
axios({ method: 'post', url: 'http://example.com/api/employees/delete',  data: 'id=1' // 表單格式參數 
}).then(result => { console.log(result.data);  
}); 

核心配置參數

Axios請求配置中常用參數如下:

參數名作用示例
method指定請求方式(默認getmethod: 'post'
url請求地址url: '/api/data'
baseURL基礎URL,自動拼接在url前(若url為絕對路徑則忽略)baseURL: 'http://example.com'
paramsGET請求參數(自動拼接到URL)params: { id: 1, name: 'test' }
dataPOST請求參數(適用于JSON或表單數據)data: { key: 'value' }
headers自定義請求頭headers: { 'Content-Type': 'application/json' }

Axios的高級特性

攔截器

攔截器用于在請求發送前或響應處理前對其進行攔截和修改,分為請求攔截器和響應攔截器:

  • 請求攔截器:可添加認證Token、設置統一請求頭。
axios.interceptors.request.use(  config => { config.headers.Authorization  = 'Bearer ' + localStorage.getItem('token');  return config; }, error => Promise.reject(error)  
); 

  • 響應攔截器:可統一處理錯誤、轉換響應數據。
axios.interceptors.response.use(  response => response.data,  // 直接返回響應數據,簡化后續處理 error => { if (error.response.status  === 401) { // 處理未授權錯誤(如跳轉登錄頁) } return Promise.reject(error);  } 
); 

Axios與傳統Ajax的對比

特性傳統Ajax(XMLHttpRequest)Axios
語法復雜度需手動創建XHR對象,處理回調地獄基于Promise,支持async/await,代碼簡潔
瀏覽器兼容性需兼容低版本瀏覽器(如IE)現代瀏覽器及Node.js 環境支持,低版本需polyfill
功能完整性需手動處理JSON轉換、超時、錯誤等內置JSON轉換、攔截器、取消請求等功能
安全性需手動實現XSRF防御內置XSRF防御機制

Axios作為對傳統Ajax的封裝,大幅降低了異步請求的開發成本,已成為前端與后端交互的主流工具,尤其在Vue、React等現代框架中被廣泛推薦使用

Axios 發送不同類型數據的區別及使用場景

Axios 發送數據時,需根據?數據類型?和?后端接口要求?選擇不同的配置方式,核心區別體現在?數據格式Content-Type 請求頭?和?傳輸位置(URL 或請求體)上。以下是常見場景的詳細對比:

一、URL 參數(params):拼接在 URL 中

用途
  • 用于 GET 請求傳遞查詢參數(如分頁、篩選、排序)。
  • 數據會以?key=value?形式拼接在 URL 末尾(如?https://api.com/data?id=1&name=test)。
配置方式

通過?params?選項傳遞,Axios 會自動將對象序列化為 URL 查詢字符串。

示例
<script>// ... 現有代碼(如 axios 基礎配置、攔截器)...{{ edit: URL 參數示例 }}// GET 請求傳遞 URL 參數async function fetchWithParams() {try {const response = await axios.get('/posts', {params: { userId: 1,  // 會自動拼接為 ?userId=1&page=1page: 1 }});console.log('URL 參數請求結果:', response);} catch (error) {console.error('請求失敗:', error);}}// 添加觸發按鈕buttonContainer.innerHTML += `<button onclick="fetchWithParams()">發送帶 URL 參數的 GET 請求</button>`;
</script>
關鍵特點
  • 傳輸位置:URL query string(可見,有長度限制)。
  • Content-Type:無需設置(GET 請求無請求體)。
  • 數據格式:簡單鍵值對(Axios 自動處理對象序列化)。

二、JSON 數據(請求體):API 接口常用

用途
  • 用于 POST/PUT/PATCH 等請求傳遞結構化數據(如創建/更新資源)。
  • 后端接口通常要求?Content-Type: application/json
配置方式

通過?data?選項傳遞 JavaScript 對象,Axios 會自動:

  1. 將對象序列化為 JSON 字符串。
  2. 設置?Content-Type: application/json?請求頭。
示例
<script>// ... 現有代碼 ...{{ edit: JSON 數據示例 }}// POST 請求發送 JSON 數據async function submitJsonData() {try {const userData = {name: "張三",age: 25,hobbies: ["coding", "reading"]  // 支持嵌套結構};const response = await axios.post('/users', userData);  // 直接傳遞對象console.log('JSON 數據提交結果:', response);} catch (error) {console.error('請求失敗:', error);}}// 添加觸發按鈕buttonContainer.innerHTML += `<button onclick="submitJsonData()">發送 JSON 數據(POST)</button>`;
</script>
關鍵特點
  • 傳輸位置:請求體(Request Body)。
  • Content-Type:自動設置為?application/json
  • 數據格式:支持復雜嵌套對象(Axios 自動 JSON.stringify)。

三、表單數據(application/x-www-form-urlencoded):傳統表單提交

用途
  • 模擬 HTML 表單提交(如?form?標簽的?method="post")。
  • 后端接口要求?Content-Type: application/x-www-form-urlencoded(數據格式為?key1=value1&key2=value2)。
配置方式

需手動將數據格式化為?URL 編碼字符串,常用兩種方式:

  1. 使用?URLSearchParams?構造函數(瀏覽器原生支持)。
  2. 使用?qs.stringify?庫(需額外引入,適合復雜對象)。
示例
<script>// ... 現有代碼 ...{{ edit: 表單數據(x-www-form-urlencoded)示例 }}// POST 請求發送表單編碼數據async function submitFormData() {try {// 方式 1:使用 URLSearchParams(簡單鍵值對)const formData = new URLSearchParams();formData.append('username', 'zhangsan');formData.append('password', '123456');// 方式 2:使用 qs.stringify(需先引入 qs 庫,適合嵌套對象)// const qs = require('qs');  // Node.js 環境// const formData = qs.stringify({ username: 'zhangsan', password: '123456' });const response = await axios.post('/login', formData);console.log('表單數據提交結果:', response);} catch (error) {console.error('請求失敗:', error);}}// 添加觸發按鈕buttonContainer.innerHTML += `<button onclick="submitFormData()">發送表單編碼數據(POST)</button>`;
</script>
關鍵特點
  • 傳輸位置:請求體。
  • Content-Type:Axios 會自動設置為?application/x-www-form-urlencoded(當使用?URLSearchParams?時)。
  • 數據格式:扁平鍵值對(不支持嵌套對象,需手動處理)。

四、文件/圖片上傳(multipart/form-data):二進制數據

用途
  • 上傳文件(如圖片、文檔),需使用?multipart/form-data?格式。
  • 數據會被分割為多個 "部分"(part),每個部分包含文件名和二進制內容。
配置方式

通過?FormData?對象構造數據,Axios 會自動:

  1. 設置?Content-Type: multipart/form-data; boundary=xxx(boundary 為自動生成的分隔符)。
  2. 處理二進制文件流。
示例
<body>{{ edit: 添加文件上傳輸入框 }}<input type="file" id="fileInput" accept="image/*">  <!-- 用于選擇圖片 --><script>// ... 現有代碼 ...{{ edit: 文件上傳示例 }}// 上傳圖片文件async function uploadImage() {try {const fileInput = document.getElementById('fileInput');const file = fileInput.files[0];  // 獲取選擇的文件if (!file) {alert('請先選擇圖片');return;}const formData = new FormData();formData.append('image', file);  // 'image' 為后端接收的字段名formData.append('description', '用戶頭像');  // 可同時傳遞其他文本字段const response = await axios.post('/upload', formData);console.log('文件上傳結果:', response);alert('上傳成功,文件 URL:' + response.url);} catch (error) {console.error('上傳失敗:', error);}}// 添加觸發按鈕buttonContainer.innerHTML += `<button onclick="uploadImage()">上傳圖片</button>`;
</script>
</body>
關鍵特點
  • 傳輸位置:請求體(二進制流)。
  • Content-Type:自動設置為?multipart/form-data(帶分隔符)。
  • 數據格式:支持文件和文本混合傳輸(通過?FormData.append()?添加)。

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

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

相關文章

41.安卓逆向2-frida hook技術-過firda檢測(五)-利用ida分析app的so文件中frida檢測函數過檢測

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

安卓調javaScript Not find method “forceLogout“ implementatidsignature or namesp

核對一下是否實現對應的javaScript或者javaScript的方法參數對不對&#xff0c; 在這里插入圖片描述我這里一開始實現了這個方法但是沒有給參數&#xff0c;一直報異常&#xff0c;后臺說token沒給就查token的問題&#xff0c;最后發現是搞偏了&#xff0c;兩個原因&#xff0c…

【Linux網絡】:UDP(傳輸層協議)

目錄 一、鋪墊知識 1、傳輸層 2、端口號 2.1、五元組表示 一個進程通信 2.2、端口號范圍劃分 2.3、知名端口 2.4、查看端口號 2.5、問題 3、pidof & netstat 命令 ①netsate 命令 ②pidof命令 二、UDP協議 1、UDP協議格式 2、UDP報文 1.1、UDP數據封裝的過…

Effective C++ 條款19: 設計class猶如設計type

Effective C 條款19&#xff1a;設計class猶如設計type核心思想&#xff1a;設計新的class時&#xff0c;應當像語言設計者設計內置類型一樣慎重&#xff0c;考慮對象的創建、銷毀、初始化、拷貝、類型轉換等所有方面。 ?? 1. 類設計的關鍵問題域 對象生命周期管理&#xff1…

《匯編語言:基于X86處理器》第11章 MS-Windows編程(3)

本章展示的是如何用32 位Microsoft Windows API進行控制臺窗口編程。應用編程接口(API:ApplicationProgramming Interface)是類型、常數和函數的集合體&#xff0c;它提供了一種用計算機代碼操作對象的方式。本章將討論文本I/O、顏色選擇、時間與日期、數據文件I/O&#xff0c;…

在 macOS 上通過 Docker 部署DM8 (ARM 架構)

概述 達夢數據庫 (DM8) 無法直接在 Apple macOS 操作系統上原生安裝&#xff0c;通常需要通過虛擬機&#xff08;如 Parallels Desktop、VMware Fusion&#xff09;進行部署。另一種更輕量級且受 macOS 支持的方案是利用 Docker 容器技術來構建開發與測試環境。本文檔將詳細介…

網絡協議之路由是怎么回事?

寫在前面 要想去外面的世界看看, 就離不了路由器&#xff0c;而路由器工作的原理就是路由&#xff0c;那么具體是怎么路由的呢&#xff1f;本文就一起來看下這部分內容。 1&#xff1a;路由的配置 配置一條路由無非就是在配置以下三個信息&#xff1a; 1:包要去哪里&#x…

2106. 摘水果,梳理思路

文章目錄題目概要java 解法詳解題目概要 在一個無限的 x 坐標軸上&#xff0c;有許多水果分布在其中某些位置。給你一個二維整數數組 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 個水果放置在 positioni 上。fruits 已經按 positioni 升序排列…

深入理解消息隊列(MQ)核心原理與設計精髓

引言&#xff1a;從一個“不堪重負”的訂單系統說起想象一個簡化的電商下單流程&#xff1a;用戶點擊“下單”后&#xff0c;系統需要&#xff1a;在訂單數據庫中創建一條記錄。調用庫存服務&#xff0c;扣減商品庫存。調用營銷服務&#xff0c;給用戶發放積分和優惠券。調用通…

前端手撕題總結篇(算法篇——來自Leetcode牛客)

鏈表指定區域反轉 找到區間&#xff08;頭和為 for循環當**時&#xff09;->反轉鏈表&#xff08;返回反轉過后的頭和尾&#xff09;->連接 function reverseBetween( head , m , n ) {//preEnd&cur&nextStart cur.next斷開if(mn)return head;const vHeadNode…

從Excel到工時管理系統:企業如何選擇更高效的工時記錄工具?

還在為手工統計員工工時而頭疼嗎&#xff1f;月末堆積如山的Excel表格、反復核對的數據、層出不窮的差錯&#xff0c;這些問題正在拖慢企業的發展步伐。8Manage工時管理系統發現&#xff0c;傳統手工記錄不僅耗費大量人力&#xff0c;更讓寶貴的工時數據難以轉化為有效的管理決…

Java設計模式之《命令模式》

目錄 1、介紹 1.1、命令模式定義 1.2、對比 1.3、典型應用場景 2、命令模式的結構 2.1、組成部分&#xff1a; 2.2、整體流程 3、實現 3.1、沒有命令模式 3.2、命令模式寫法 4、命令模式的優缺點 前言 java設計模式分類&#xff1a; 1、介紹 1.1、命令模式定義 命…

【動態規劃算法】路徑問題

什么是動態規劃算法動態規劃&#xff08;Dynamic Programming&#xff0c;簡稱 DP&#xff09;是一種通過分解復雜問題為重疊子問題&#xff0c;并存儲子問題的解以避免重復計算&#xff0c;從而高效求解具有特定性質&#xff08;重疊子問題、最優子結構&#xff09;問題的算法…

Java基本技術講解

一、基礎語法三要素 暫時無法在飛書文檔外展示此內容 &#x1f511; 黃金法則?&#xff1a;每個變量都要聲明類型&#xff01;二、程序邏輯控制&#xff08;游戲行為核心&#xff09; 條件判斷&#xff1a;if-else - “岔路口選擇” // 撿到金幣邏輯 if (isTouching(Coin.clas…

【網絡基礎2】路由器的 “兩扇門”:二層接口和三層接口到底有啥不一樣?

目錄 前言:路由器不是只有 “插網線的口” 一、先搞懂一個基礎:路由器是 “網絡交通樞紐” 二、二層接口:“小區內部的單元門”,只認 “住戶身份證” 1. 啥是二層接口? 2. 用 “小區內部串門” 理解二層接口 步驟 1:手機打包數據,寫上 “收件人身份證” 步驟 2:二…

MLIR TableGen

簡介 TableGen 是一種領域特定語言&#xff08;DSL&#xff09;&#xff0c;TableGen 的設計目標是允許編寫靈活的描述&#xff0c;并將記錄的通用特性提取出來&#xff0c;從而減少重復代碼并提高代碼的可維護性。 TableGen的工作流程&#xff1a; 前端解析&#xff1a; Ta…

2、docker容器命令 | 信息查看

1、命令總覽命令作用docker ps查看運行中的容器&#xff08;-a查看所有容器&#xff09;docker logs [CONTAINER]查看容器日志&#xff08;-f實時追蹤日志&#xff09;docker inspect [CONTAINER]查看容器詳細信息&#xff08;JSON格式&#xff09;docker stats [CONTAINER]實時…

【MySQL】MySQL中鎖有哪些?

一、按照粒度分類&#xff1a; 粒度越小&#xff0c;并發度越高&#xff0c;鎖開銷越大。 1.全局鎖&#xff1a; 作用&#xff1a; 鎖定整個MySQL實例(所有數據庫)。適用場景&#xff1a; 全庫邏輯部分。(確保備份期間數據的一致性。)實現方式&#xff1a; 通過 FLUSH TABLES W…

語義分割--deeplabV3+

根據論文網絡結構圖講一下&#xff1a;網絡分為兩部分&#xff1a;encoder和decoder部分。 Encoder&#xff1a;DCNN就是主干網絡&#xff0c;例如resnet&#xff0c;Xception&#xff0c;MobileNet這些&#xff08;主干網絡也要使用空洞卷積&#xff09;&#xff0c;對dcnn的結…

Azure DevOps 中的代理

必知詞匯 深入研究 Azure DevOps 中的代理之前需要掌握的基本概念: 代理:Azure DevOps 中的代理是一個軟件組件,負責執行流水線中的任務和作業。這可能包括數據中心內的物理服務器、本地或云端托管的虛擬機,甚至是容器化環境。這些代理可以在各種操作系統和環境中運行,例如…