简介:本文详细阐述如何使用axios库调用接口并获取数据,涵盖基础用法、高级配置、错误处理及最佳实践,助力开发者高效实现API交互。
axios作为基于Promise的HTTP客户端,凭借其轻量级(仅20KB+)、浏览器与Node.js双环境支持、请求/响应拦截器等特性,成为前端开发中接口调用的首选工具。其核心优势包括:
.then()和.catch()实现异步流程的清晰管理,避免回调地狱。JSON.parse()。CancelToken或AbortController取消进行中的请求,优化性能。通过npm或yarn安装axios:
npm install axios# 或yarn add axios
import axios from 'axios';// 基本GET请求axios.get('https://api.example.com/data').then(response => {console.log('数据获取成功:', response.data);}).catch(error => {console.error('请求失败:', error.message);});
关键点:
response.data直接包含服务器返回的JSON数据。error.response(服务器返回的错误响应)和error.message(网络错误)。
const postData = { name: 'John', age: 30 };axios.post('https://api.example.com/submit', postData).then(response => {console.log('提交成功:', response.data);});
参数说明:
axios.post(url, data, {headers: { 'Content-Type': 'application/json' }});
通过axios.defaults设置全局默认值:
axios.defaults.baseURL = 'https://api.example.com';axios.defaults.timeout = 5000; // 超时时间(毫秒)axios.defaults.headers.common['Authorization'] = 'Bearer token123';
创建独立实例以隔离配置:
const apiInstance = axios.create({baseURL: 'https://api.example.com/v2',timeout: 3000});apiInstance.get('/data').then(...);
请求拦截器(添加token):
axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;}, error => {return Promise.reject(error);});
响应拦截器(统一处理错误):
axios.interceptors.response.use(response => {// 仅返回data部分,简化后续处理return response.data;}, error => {if (error.response.status === 401) {alert('请重新登录');window.location.href = '/login';}return Promise.reject(error);});
使用axios.all和axios.spread处理多个并行请求:
const request1 = axios.get('/user/1');const request2 = axios.get('/user/1/permissions');axios.all([request1, request2]).then(axios.spread((userRes, permRes) => {console.log('用户数据:', userRes.data);console.log('权限数据:', permRes.data);}));
error.message包含错误详情(如Network Error)。error.response包含状态码、数据和头信息。
axios.get('/nonexistent').catch(error => {if (error.response) {console.log('服务器错误:', error.response.status);} else if (error.request) {console.log('无响应:', error.request);} else {console.log('请求设置错误:', error.message);}});
import MockAdapter from 'axios-mock-adapter';const mock = new MockAdapter(axios);mock.onGet('/users').reply(200, { users: [{ id: 1 }] });
避免组件卸载后继续处理响应:
const CancelToken = axios.CancelToken;let cancel;axios.get('/data', {cancelToken: new CancelToken(c => {cancel = c;})});// 取消请求cancel('用户取消了请求');
对不频繁变动的数据实现本地缓存:
const cache = new Map();function fetchData(url) {if (cache.has(url)) {return Promise.resolve(cache.get(url));}return axios.get(url).then(response => {cache.set(url, response.data);return response.data;});}
为axios请求添加类型定义:
interface User {id: number;name: string;}axios.get<User>('/user/1').then(response => {const user: User = response.data; // 类型安全});
通过掌握axios的核心功能与高级技巧,开发者能够构建更健壮、高效的前端应用。建议从简单请求开始实践,逐步引入拦截器、并发处理等优化手段,最终形成符合项目需求的API交互层解决方案。