简介:本文详细介绍了axios的封装策略与API管理实践,通过实例代码展示如何构建简洁、实用的HTTP请求库,提升开发效率与代码可维护性。
在前端开发中,HTTP请求是连接客户端与服务端的核心环节。axios作为一款基于Promise的HTTP客户端,因其简洁的API、丰富的配置选项和浏览器/Node.js双端支持,成为前端开发者的首选。然而,随着项目规模的扩大,直接使用axios会导致以下问题:
因此,对axios进行封装并建立统一的API管理体系,是提升开发效率、保障代码质量的关键。
封装的目标是让开发者以最少的代码完成HTTP请求。例如,一个未封装的GET请求可能需要如下代码:
axios.get('/api/user', {params: { id: 123 },headers: { 'Authorization': 'Bearer xxx' }}).then(response => {console.log(response.data);}).catch(error => {console.error('请求失败:', error);});
封装后,可以简化为:
api.getUser({ id: 123 }).then(data => {console.log(data);});
封装应涵盖以下功能:
封装不应限制灵活性,需允许开发者覆盖默认配置(如超时时间、基础URL)。
import axios from 'axios';const service = axios.create({baseURL: process.env.VUE_APP_BASE_API, // 从环境变量读取基础URLtimeout: 5000, // 请求超时时间headers: { 'Content-Type': 'application/json' }});
在发送请求前,可以统一添加Token或处理参数:
service.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers['Authorization'] = `Bearer ${token}`;}return config;},error => {return Promise.reject(error);});
统一处理响应数据和错误:
service.interceptors.response.use(response => {const res = response.data;if (res.code !== 200) {// 业务错误处理return Promise.reject(new Error(res.message || 'Error'));} else {return res.data; // 直接返回业务数据}},error => {// 网络错误或超时处理return Promise.reject(error);});
const api = {get(url, params) {return service.get(url, { params });},post(url, data) {return service.post(url, data);},put(url, data) {return service.put(url, data);},delete(url, params) {return service.delete(url, { params });}};export default api;
将API按功能模块组织,例如:
src/api/user.js # 用户相关APIproduct.js # 产品相关APIorder.js # 订单相关API
import api from './request'; // 导入封装后的axiosexport default {// 获取用户信息getUser(params) {return api.get('/user', params);},// 创建用户createUser(data) {return api.post('/user', data);},// 更新用户updateUser(id, data) {return api.put(`/user/${id}`, data);},// 删除用户deleteUser(id) {return api.delete(`/user/${id}`);}};
import userApi from '@/api/user';export default {methods: {async fetchUser() {try {const user = await userApi.getUser({ id: 123 });this.user = user;} catch (error) {console.error('获取用户失败:', error);}}}};
为API定义接口类型,增强代码可维护性:
interface User {id: number;name: string;email: string;}interface UserApi {getUser(params: { id: number }): Promise<User>;createUser(data: Omit<User, 'id'>): Promise<User>;}const userApi: UserApi = {getUser(params) {return api.get('/user', params);},createUser(data) {return api.post('/user', data);}};
使用CancelToken避免重复请求:
let cancel;service.interceptors.request.use(config => {if (cancel) {cancel(); // 取消上一个未完成的请求}config.cancelToken = new axios.CancelToken(c => {cancel = c;});return config;});
对不频繁变动的数据(如配置信息)进行缓存:
const cache = new Map();export default {getCachedData(url) {if (cache.has(url)) {return Promise.resolve(cache.get(url));}return api.get(url).then(data => {cache.set(url, data);return data;});}};
通过合理的axios封装与API管理,可以显著提升开发效率,降低维护成本,是前端工程化的重要环节。