文章目錄
- Axios 知識點全面總結
- 一、Axios 基礎概念
- 1. 什么是 Axios?
- 2. 核心特性
- 二、安裝與基本用法
- 1. 安裝
- 2. 基本請求示例
- 三、請求方法與參數
- 四、請求配置選項(config)
- 五、攔截器(Interceptors)
- 六、錯誤處理
- 七、取消請求
- 八、并發請求
- 九、創建實例(Instance)
- 十、與框架集成
- 十一、最佳實踐與常見問題
- 十二、TypeScript 支持
- 十三、Axios 調用后端全局 API
- 1、全局方法 httpClient.js
- 2、四種 HTTP 方法 封裝 api.js
- 3、使用封裝方法 userService.js
Axios 知識點全面總結
一、Axios 基礎概念
1. 什么是 Axios?
Axios 是一個 基于 Promise 的 HTTP 客戶端庫
,用于瀏覽器和 Node.js 環境中發送 HTTP 請求。它支持 請求 / 響應攔截、請求取消、Promise 鏈式調用
等特性,是前端開發中最常用的 HTTP 庫之一。
2. 核心特性
- 支持瀏覽器和 Node.js 環境
- 基于 Promise 實現,支持 async/await
- 提供請求 / 響應攔截器,方便處理請求和響應數據
- 支持請求取消(通過 CancelToken 或 AbortController)
- 自動轉換請求和響應數據(JSON 數據處理)
- 支持請求超時設置、自定義請求頭、并發請求等
二、安裝與基本用法
1. 安裝
# 通過 npm 安裝
npm install axios# 通過 yarn 安裝
yarn add axios# 瀏覽器直接引入(CDN)
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
2. 基本請求示例
// 發送 GET 請求
axios.get('/api/data').then(response => {console.log(response.data);}).catch(error => {console.error('請求錯誤:', error);});// 發送 POST 請求
axios.post('/api/user', {name: '張三',age: 25
})
.then(response => {console.log(response.data);
})
.catch(error => {console.error('請求錯誤:', error);
});// 使用 async/await
async function fetchData() {try {const response = await axios.get('/api/data');return response.data;} catch (error) {throw new Error('獲取數據失敗: ' + error.message);}
}
三、請求方法與參數
方法 | 描述 | 參數格式 |
---|---|---|
axios.get(url[, config]) | 發送 GET 請求(獲取資源) | url, config(可選配置) |
axios.post(url[, data, config]) | 發送 POST 請求(提交資源) | url, data(請求體), config |
axios.put(url[, data, config]) | 發送 PUT 請求(更新資源) | url, data, config |
axios.delete(url[, config]) | 發送 DELETE 請求(刪除資源) | url, config |
axios.head(url[, config]) | 發送 HEAD 請求(獲取資源頭部信息) | url, config |
axios.patch(url[, data, config]) | 發送 PATCH 請求(部分更新資源) | url, data, config |
示例:帶參數的 GET 請求
// 方式一:通過 params 參數傳遞查詢參數
axios.get('/api/users', {params: {id: 1,name: '張三'}
})// 方式二:直接拼接 URL(不推薦,手動處理編碼)
axios.get('/api/users?id=1&name=張三')
四、請求配置選項(config)
Axios 的請求配置可用于自定義請求行為,常用配置如下:
- 基礎配置
{url: '/api/data', // 請求 URLmethod: 'get', // 請求方法(get/post/put等)baseURL: 'https://api.example.com', // 基礎 URL,會與 url 拼接timeout: 5000, // 請求超時時間(毫秒),超過則報錯withCredentials: true, // 是否攜帶 cookie(跨域請求時)responseType: 'json', // 響應數據類型(json/blob/text等)headers: { 'X-Custom-Header': 'value' }, // 請求頭
}
- 請求數據相關
{data: { key: value }, // POST/PUT 等請求的請求體數據params: { id: 1 }, // GET 請求的查詢參數paramsSerializer: function(params) {// 自定義參數序列化方式return Qs.stringify(params, { arrayFormat: 'brackets' });}
}
五、攔截器(Interceptors)
攔截器用于在請求發送前或響應接收后統一處理數據,分為 請求攔截器
和 響應攔截器
。
- 請求攔截器
// 添加請求攔截器
axios.interceptors.request.use(config => {// 在請求發送前做些什么(如添加 token、修改請求頭)const token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;},error => {// 處理請求錯誤return Promise.reject(error);}
);
- 響應攔截器
// 添加響應攔截器
axios.interceptors.response.use(response => {// 對響應數據做統一處理(如錯誤碼判斷、數據格式化)const { data } = response;if (data.code !== 200) {// 錯誤處理(如提示用戶、跳轉登錄頁)throw new Error(data.message || '請求失敗');}return data; // 直接返回處理后的數據,簡化后續 then 操作},error => {// 處理響應錯誤(如網絡錯誤、404、500 等)const { response } = error;if (response) {// 響應已接收但狀態碼非 2xxswitch (response.status) {case 401:console.log('未授權,請重新登錄');break;case 404:console.log('資源不存在');break;default:console.log('服務器錯誤');}} else {// 網絡錯誤(如超時、斷網)console.log('網絡連接失敗');}return Promise.reject(error);}
);
- 移除攔截器
const myInterceptor = axios.interceptors.request.use(...);
axios.interceptors.request.eject(myInterceptor); // 移除請求攔截器
六、錯誤處理
Axios 的錯誤處理通過 catch 或 try/catch 實現,常見錯誤類型:
axios.get('/api/data').then(response => {// 處理成功響應}).catch(error => {if (axios.isAxiosError(error)) {// 處理 Axios 錯誤(如請求錯誤、響應錯誤)console.log('Axios 錯誤:', error.message);console.log('錯誤狀態碼:', error.response?.status);console.log('錯誤響應數據:', error.response?.data);} else {// 處理其他錯誤(如網絡錯誤)console.log('其他錯誤:', error);}});
七、取消請求
在組件卸載或請求不再需要時,可取消請求以避免資源浪費。
- 使用 CancelToken(舊方式)
import axios from 'axios';const source = axios.CancelToken.source();axios.get('/api/data', {cancelToken: source.token
}).then(response => {// 處理響應
}).catch(error => {if (axios.isCancel(error)) {console.log('請求已取消:', error.message);}
});// 取消請求
source.cancel('用戶取消了請求');
- 使用 AbortController(推薦,瀏覽器原生支持)
const controller = new AbortController();
const signal = controller.signal;axios.get('/api/data', { signal }).then(response => {// 處理響應}).catch(error => {if (error.name === 'AbortError') {console.log('請求已取消');}});// 取消請求
controller.abort();
八、并發請求
Axios 提供 axios.all
方法處理多個并發請求,并通過 axios.spread
分配結果。
const request1 = axios.get('/api/data1');
const request2 = axios.get('/api/data2');axios.all([request1, request2]).then(axios.spread((response1, response2) => {// 兩個請求都成功時執行console.log('數據1:', response1.data);console.log('數據2:', response2.data);})).catch(errors => {// 任一請求失敗時執行console.log('并發請求錯誤:', errors);});
九、創建實例(Instance)
當需要不同配置的請求時,可創建多個 Axios 實例。
// 創建自定義實例
const instance = axios.create({baseURL: 'https://api.example.com',timeout: 10000,headers: {'Content-Type': 'application/json'}
});// 使用實例發送請求
instance.get('/users').then(response => {console.log(response.data);});// 為實例添加攔截器
instance.interceptors.request.use(...);
十、與框架集成
- 在 Vue 中使用
// main.js 中配置
import axios from 'axios';
Vue.prototype.$axios = axios; // 將 axios 掛載到 Vue 實例上// 組件中使用
this.$axios.get('/api/data').then(response => {this.data = response.data;});
- 在 React 中使用
import axios from 'axios';function fetchData() {return axios.get('/api/data').then(response => response.data);
}function MyComponent() {const [data, setData] = useState(null);useEffect(() => {fetchData().then(setData);// 組件卸載時取消請求(使用 AbortController)const controller = new AbortController();return () => controller.abort();}, []);// ...
}
十一、最佳實踐與常見問題
- 設置默認配置
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
-
處理跨域請求
前端設置 withCredentials: true
后端配置 CORS 響應頭(如 Access-Control-Allow-Origin) -
請求超時重試
// 封裝超時重試函數
function retryRequest(config, retries = 3) {return new Promise((resolve, reject) => {const attempt = () => {axios(config).then(resolve).catch(error => {if (error.code === 'ECONNABORTED' && retries > 0) {// 超時錯誤且還有重試次數setTimeout(() => {retryRequest(config, retries - 1).then(resolve, reject);}, 1000);} else {reject(error);}});};attempt();});
}
- 與 Fetch API 對比
Axios 優勢:瀏覽器 / Node 通用、攔截器、自動轉換 JSON、錯誤處理更友好
Fetch 優勢:瀏覽器原生支持、更簡潔的 API、支持 AbortController(需 polyfill 兼容舊瀏覽器)
十二、TypeScript 支持
Axios 原生支持 TypeScript,可通過泛型指定響應數據類型:
interface User {id: number;name: string;
}// 指定響應數據類型為 User 數組
axios.get<User[]>('/api/users').then(response => {// response.data 會被推斷為 User[] 類型const firstUser = response.data[0].name;});
十三、Axios 調用后端全局 API
1、全局方法 httpClient.js
import axios from 'axios';// 創建 axios 實例
const service = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API, // 從環境變量獲取API基礎URLtimeout: 5000, // 請求超時時間headers: {'Content-Type': 'application/json;charset=utf-8'}
});// 請求攔截器
service.interceptors.request.use(config => {// 在發送請求之前做些什么// 例如添加 tokenconst token = localStorage.getItem('token');if (token) {config.headers['Authorization'] = `Bearer ${token}`;}return config;},error => {// 對請求錯誤做些什么console.log(error); // for debugreturn Promise.reject(error);}
);// 響應攔截器
service.interceptors.response.use(response => {// 對響應數據做點什么const res = response.data;// 假設業務狀態碼 200 表示成功if (res.code !== 200) {console.log(res.message || 'Error');return Promise.reject(new Error(res.message || 'Error'));} else {return res;}},error => {// 對響應錯誤做點什么console.log('err' + error); // for debugreturn Promise.reject(error);}
);export default service;
2、四種 HTTP 方法 封裝 api.js
import service from './httpClient';/*** get 請求* @param {string} url 請求路徑* @param {object} params 請求參數* @returns {Promise}*/
export function get(url, params) {return service({url,method: 'get',params});
}/*** post 請求* @param {string} url 請求路徑* @param {object} data 請求數據* @returns {Promise}*/
export function post(url, data) {return service({url,method: 'post',data});
}/*** put 請求* @param {string} url 請求路徑* @param {object} data 請求數據* @returns {Promise}*/
export function put(url, data) {return service({url,method: 'put',data});
}/*** delete 請求* @param {string} url 請求路徑* @param {object} params 請求參數* @returns {Promise}*/
export function del(url, params) {return service({url,method: 'delete',params});
}
3、使用封裝方法 userService.js
import { get, post, put, del } from './api';// 獲取用戶列表
export function getUserList(params) {return get('/api/users', params);
}// 創建用戶
export function createUser(data) {return post('/api/users', data);
}// 更新用戶信息
export function updateUser(id, data) {return put(`/api/users/${id}`, data);
}// 刪除用戶
export function deleteUser(id) {return del(`/api/users/${id}`);
}
這個封裝包含三個主要部分:
- 基礎配置和攔截器設置(httpClient.js)
- 四種 HTTP 方法的封裝(api.js)
- 示例服務模塊(userService.js)展示如何使用封裝的方法