Axios完全指南:前端工程师必备的HTTP请求艺术
本文最后更新于 46 天前,其中的信息可能已经有所发展或是发生改变。

🌟 为什么选择Axios?

+ 支持浏览器和Node.js双环境
+ 自动JSON数据转换
+ 请求/响应拦截器体系
+ 内置CSRF/XSRF防御
+ 支持Promise API
- 相比Fetch API增加约12kb体积

⚡ 5分钟快速上手

1. 基础安装

npm install axios
# 或
yarn add axios

2. 发起第一个请求

import axios from 'axios';

// GET请求
axios.get('/api/user')
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

// POST请求
axios.post('/api/login', {
  username: 'admin',
  password: 'securePassword123'
});

💡 核心功能解析

1. 创建实例与默认配置

const api = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000,
  headers: {'X-Custom-Header': 'foobar'}
});

// 全局默认配置
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

2. 拦截器工作流

// 请求拦截器
api.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${getToken()}`;
  return config;
});

// 响应拦截器
api.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response.status === 401) {
      redirectToLogin();
    }
    return Promise.reject(error);
  }
);

3. 并发处理

const getUser = axios.get('/user/123');
const getPosts = axios.get('/posts');

axios.all([getUser, getPosts])
  .then(axios.spread((userRes, postsRes) => {
    console.log('用户数据:', userRes.data);
    console.log('文章列表:', postsRes.data);
  }));

🔥 高级应用场景

场景1:取消请求

const controller = new AbortController();

axios.get('/api/data', {
  signal: controller.signal
}).catch(error => {
  if (axios.isCancel(error)) {
    console.log('请求被取消:', error.message);
  }
});

// 取消请求
controller.abort('用户主动取消操作');

场景2:文件上传进度

axios.post('/api/upload', formData, {
  onUploadProgress: progressEvent => {
    const percent = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    );
    console.log(`上传进度: ${percent}%`);
  }
});

场景3:自定义适配器

const adapter = axios.create({
  adapter: config => {
    /* 自定义请求逻辑 */
    return new Promise((resolve, reject) => {
      // 实现自定义网络库整合
    })
  }
});

🛠️ 企业级最佳实践

1. 安全配置方案

// 防止XSS攻击
axios.defaults.xsrfCookieName = 'CSRF-TOKEN';
axios.defaults.xsrfHeaderName = 'X-CSRF-TOKEN';

// 设置Content Security Policy
axios.defaults.headers.common['Content-Security-Policy'] = "default-src 'self'";

2. 性能优化策略

// 请求缓存实现
const cache = new Map();

async function cachedRequest(url) {
  if (cache.has(url)) {
    return cache.get(url);
  }
  const response = await axios.get(url);
  cache.set(url, response.data);
  return response.data;
}

3. 错误处理标准

function handleError(error) {
  if (error.response) {
    // 服务端返回非常规2xx响应
    console.error(`状态码: ${error.response.status}`);
    console.error(error.response.data);
  } else if (error.request) {
    // 请求已发出但无响应
    console.error('网络连接异常');
  } else {
    // 请求配置错误
    console.error('请求配置错误:', error.message);
  }
  return Promise.reject(error);
}

⚠️ 常见问题排雷指南

1. CORS跨域问题

// 后端需设置
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: *

// 前端配置
axios.post(url, data, {
  withCredentials: true
});

2. 请求参数序列化

const paramsSerializer = params => {
  return qs.stringify(params, { arrayFormat: 'brackets' });
};

axios.get('/api', { params: { ids: [1,2,3] }, paramsSerializer });

3. 多次拦截器执行

// 移除拦截器示例
const interceptor = axios.interceptors.request.use(...);
axios.interceptors.request.eject(interceptor);

+ 推荐配置:为不同业务模块创建独立axios实例
+ 性能提示:合理使用请求缓存与取消功能
- 注意:避免在拦截器中执行阻塞性操作

最后思考:Axios vs Fetch

对比维度 Axios Fetch API
浏览器兼容性 IE11+ 现代浏览器
请求取消 支持 AbortController
进度跟踪 支持 手动实现
超时设置 原生支持 需封装实现
拦截器 完整体系 需手动实现
数据转换 自动转换JSON 需手动处理

选择建议:复杂项目首选Axios,轻量级场景可考虑Fetch API

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇