Axios库在JavaScript中发送HTTP请求的快速上手

作者:小括号时间:2026-11-03 18:41:24浏览:237

本文介绍如何在JavaScript中使用Axios库快速发送HTTP请求,涵盖安装引入、GET与POST基本用法、配置请求头与参数、统一错误处理及拦截器使用方法。

Axios 是一个基于 Promise 构建的高效 HTTP 请求库,同时支持浏览器和 Node.js 环境。使用 Axios 替代原生 XMLHttpRequest 或 fetch,能够自动转换 JSON 数据、简化传参与请求头设置,并通过实例配置与拦截器实现健壮的全局网络控制。本文通过安装引入、基础 GET/POST 构造、自定义实例配置以及拦截器统一异常处理四项核心内容,帮助开发者在实际项目中快速建立规范可靠的 HTTP 请求流程。
Axios库在JavaScript中发送HTTP请求的快速上手
图 0:Axios 在客户端与服务端之间的网络通信分层概览

一、准备工作与环境引入

在使用 Axios 之前,首先需要将其引入到运行环境中。Axios 同时支持 Node.js 工程化项目(如 Vue、React、原生 Node 等)与传统纯 HTML 页面。

1. Node.js 与前端工程化环境安装

在基于 npm 或 yarn 的项目中,在项目根目录运行安装命令:

# 使用 npm 安装
npm install axios

# 或使用 yarn 安装
yarn add axios

在 JavaScript 文件或模块中按如下方式导入:

// ES Module 规范(现代前端框架中常见)
import axios from 'axios';

// CommonJS 规范(Node.js 原生环境常见)
const axios = require('axios');

2. 浏览器直接通过 CDN 引入

如果是简单的静态 HTML 页面,无需打包构建工具,可直接在 <head> 或 <body> 底部通过 <script> 标签引入公网 CDN 资源:

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
  // 引入后全局直接暴露 axios 对象
  console.log('Axios 载入成功:', typeof axios.get === 'function');
</script>
Axios库在JavaScript中发送HTTP请求的快速上手
图 1:使用 Axios 发起网络请求的标准操作路径

二、发送基础 GET 与 POST 请求

Axios 每一个请求方法都返回一个标准的 JavaScript Promise。开发者可以使用 .then() / .catch() 链式调用,也可以在 async 函数中使用 await 关键字,后者使异步代码更加扁平易读。

1. 发送 GET 请求并传递查询参数

GET 请求通常用于从服务端获取数据。如果需要向 URL 附带查询字符串(Query Parameters),应使用配置对象中的 params 属性,Axios 会自动将其拼接到 URL 后面,并完成编码:

import axios from 'axios';

async function fetchUserList(page, keyword) {
  try {
    // params 会自动格式化为: https://api.example.com/users?page=1&keyword=admin
    const response = await axios.get('https://api.example.com/users', {
      params: {
        page: page,
        keyword: keyword
      }
    });

    // 重点:Axios 已经将返回的 JSON 字符串自动解析为 JavaScript 对象
    console.log('状态码:', response.status);
    console.log('数据内容:', response.data);
    return response.data;
  } catch (error) {
    console.error('获取用户失败:', error.message);
  }
}

// 调用示例
fetchUserList(1, 'admin');

2. 发送 POST 请求并提交实体数据

POST 请求用于向服务器提交数据。axios.post 的第二个参数就是请求体(Request Body)。当传入普通 JavaScript 对象时,Axios 会默认设置请求头 Content-Type: application/json,并将对象自动序列化为 JSON 字符串:

async function createNewArticle(articleData) {
  try {
    const payload = {
      title: articleData.title,
      content: articleData.content,
      publishDate: new Date().toISOString()
    };

    const response = await axios.post('https://api.example.com/articles', payload);

    if (response.status === 201 || response.status === 200) {
      console.log('文章创建成功,服务端返回 ID:', response.data.id);
    }
  } catch (error) {
    console.error('提交文章失败:', error.message);
  }
}

3. 理解 Axios 响应对象(Response Schema)

与原生的 fetch 不同,Axios 成功回调中接收到的不是原始流,而是一个封装好的响应对象,其主要结构如下:

Axios库在JavaScript中发送HTTP请求的快速上手
图 2:Axios 发送端配置与接收端响应对象解构

三、创建自定义实例与模块化管理

在实际生产开发中,不建议直接在业务代码各处随意调用全局 axios.get。因为项目通常拥有统一的 API 域名、特定的网关前缀以及固定的超时时间。通过 axios.create() 创建独立实例,可以实现请求参数的集中管理与多环境隔离。

// api/request.js
import axios from 'axios';

// 创建针对主业务接口的 Axios 实例
const apiClient = axios.create({
  baseURL: 'https://api.example.com/v1', // 接口基础路径
  timeout: 8000,                          // 超时时间:8 秒
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
});

// 在具体业务模块中直接复用该实例,只写相对路径
export async function getProductDetail(productId) {
  // 最终请求路径: https://api.example.com/v1/products/1001
  const response = await apiClient.get(`/products/${productId}`);
  return response.data;
}
Axios库在JavaScript中发送HTTP请求的快速上手
图 3:全局调用与基于 axios.create() 实例隔离的设计模式对比

四、请求拦截器与统一错误处理

拦截器(Interceptors)是 Axios 最强大的特性之一。它允许在请求发送到网络之前,或者在响应传递给业务 then/catch 之前,横向切入并执行公共逻辑。

1. 请求拦截器:动态添加鉴权头

通常用户登录后,所有后续请求都需要在 HTTP 标头中附带 Token。利用请求拦截器可以自动提取并注入,免去每个请求手动书写的繁琐:

// 添加请求拦截器
apiClient.interceptors.request.use(
  (config) => {
    // 从本地存储中读取 token
    const token = localStorage.getItem('access_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    // 打印当前请求地址用于调试
    console.log(`[HTTP Request] 发起请求 -> ${config.method.toUpperCase()} ${config.url}`);
    return config;
  },
  (error) => {
    // 请求构造阶段发生错误
    return Promise.reject(error);
  }
);

2. 响应拦截器:数据解包与全局状态码分发

业务代码通常只关心 response.data 中的实际字段,而不希望每次都手动 res.data.data。同时,对于 401(未授权登出)、403(无权访问)、500(服务器内部故障)等异常,响应拦截器能提供统一的处理入口:

// 添加响应拦截器
apiClient.interceptors.response.use(
  (response) => {
    // HTTP 状态码为 2xx 时触发
    // 直接返回解包后的业务数据
    return response.data;
  },
  (error) => {
    // HTTP 状态码超出 2xx 或网络故障时触发
    if (error.response) {
      const { status, data } = error.response;
      switch (status) {
        case 401:
          console.warn('登录已失效,引导跳转至登录页');
          localStorage.removeItem('access_token');
          // 可在此处派发路由跳转
          break;
        case 403:
          console.error('权限不足,拒绝访问');
          break;
        case 500:
          console.error('服务端内部错误,提示用户稍后重试:', data.message || '未知故障');
          break;
        default:
          console.error(`请求异常 [${status}]:`, data);
      }
    } else if (error.request) {
      // 请求已发出但未收到任何响应(如网络中断、DNS 解析失败、超时)
      console.error('网络连接不可用,请检查网络设置或服务是否存活');
    } else {
      // 触发请求前发生内部错误
      console.error('配置错误:', error.message);
    }

    return Promise.reject(error);
  }
);
Axios库在JavaScript中发送HTTP请求的快速上手
图 4:Axios 请求拦截与响应生命周期全景流程图

五、快速上手重点与避坑指南

初学者在使用 Axios 发送 HTTP 请求时,常常因概念混淆而遇到一些典型问题,在实际开发中需特别留意以下三点:

1. 传参位置混淆:params 与 data

这是最常见的使用错误:

  • params:对应 URL Query 参数(如 ?id=123&type=normal),无论是 GET 还是 POST 请求,放入 params 的属性都会被拼接到 URL 上。
  • data:对应 HTTP 请求体(Request Payload)。通常仅用于 POST、PUT、PATCH 请求。在 GET 请求中传 data 大多数后端和代理服务器将直接忽略。
注意事项:使用 axios.post(url, data, config) 时,第二个参数直接是请求体 data,如果要在 POST 中同时传递 Query 参数,配置对象应作为第三个参数传入: axios.post('/submit', { bodyKey: 'val' }, { params: { queryKey: 'q' } })。

2. 跨域问题(CORS)与 Axios 的关系

当在浏览器控制台看到 Access-Control-Allow-Origin 相关红字报错时,属于浏览器的同源安全策略拦截,而非 Axios 库本身的 Bug。解决方法需要在服务端配置允许跨域响应标头,或者在本地开发阶段(如 Vite、Webpack Dev Server)配置 proxy 代理转发。

3. 正确配置超时时间(timeout)

Axios 默认没有设置超时上限(timeout: 0,即无限等待)。在生产应用中务必指定合理的 timeout(如 5000 ~ 10000 毫秒),避免在移动网络波动或服务端无响应时,客户端界面无限期挂起处于死锁状态。

总结:Axios 凭借一致的 Promise API、自动数据序列化、灵活的实例隔离与拦截器机制,成为了 JavaScript 生态中最主流的 HTTP 请求方案之一。掌握“安装引入 → 基础 GET/POST → axios.create 实例封装 → 拦截器统一控制”这一条清晰的路径,就能应对绝大多数前端与 Node.js 服务端的网络交互需求。
作者最新文章
相关文章
更多