axios基础入门教程

一、axios 简介

axios 是一个基于 Promise 的 HTTP 客户端,可用于浏览器和 Node.js 环境,支持以下特性:

发送 HTTP 请求(GET/POST/PUT/DELETE 等)

拦截请求和响应

自动转换 JSON 数据

取消请求

并发请求处理

二、安装

  1. 使用 npm/yarn

    npm install axios# 或yarn add axios

  2. 浏览器直接引入

    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

三、基本用法

  1. 发送 GET 请求

    axios.get('https://api.example.com/data') .then(response => { console.log(response.data); // 响应数据 }) .catch(error => { console.error('请求失败:', error); });

  2. 发送 POST 请求​​​​​​​

    axios.post('https://api.example.com/data', { name: 'John', age: 30 }) .then(response => { console.log(response.data); });

  3. 使用 async/await​​​​​​​

    async function fetchData() { try { const response = await axios.get('https://api.example.com/data'); console.log(response.data); } catch (error) { console.error(error); }}

四、请求配置

  1. 全局默认配置​​​​​​​

    axios.defaults.baseURL = 'https://api.example.com';axios.defaults.headers.common['Authorization'] = 'Bearer token123';axios.defaults.timeout = 5000; // 超时时间

  2. 单个请求配置​​​​​​​

    axios.get('/data', { params: { id: 1 }, // 查询参数 headers: { 'X-Custom-Header': 'value' }});

五、响应结构

响应对象包含以下字段:​​​​​​​

复制代码
{  data: {},       // 服务器返回的数据  status: 200,    // HTTP 状态码  statusText: 'OK',  headers: {},     // 响应头  config: {},      // 请求配置  request: {}      // 原始的 XMLHttpRequest 对象(浏览器)}

六、错误处理

  1. 通用错误捕获​​​​​​​

    axios.get('/data') .catch(error => { if (error.response) { // 服务器返回了非 2xx 状态码 console.log(error.response.status); console.log(error.response.data); } else if (error.request) { // 请求已发送但无响应 console.log('No response received'); } else { // 请求配置错误 console.log('Error:', error.message); } });

  2. 全局错误拦截​​​​​​​

    axios.interceptors.response.use( response => response, error => { // 统一处理错误 return Promise.reject(error); });

七、高级功能

  1. 并发请求​​​​​​​

    const request1 = axios.get('/data1');const request2 = axios.get('/data2');axios.all([request1, request2]) .then(axios.spread((res1, res2) => { console.log(res1.data, res2.data); }));

  2. 取消请求​​​​​​​

    const source = axios.CancelToken.source();axios.get('/data', { cancelToken: source.token}).catch(thrown => { if (axios.isCancel(thrown)) { console.log('请求被取消:', thrown.message); }});// 取消请求source.cancel('用户取消操作');

  3. 请求拦截器​​​​​​​

    axios.interceptors.request.use( config => { // 在发送请求前做些什么(如添加 token) config.headers.Authorization = 'Bearer token'; return config; }, error => { return Promise.reject(error); });

八、常见场景示例

  1. 上传文件​​​​​​​

    const formData = new FormData();formData.append('file', fileInput.files[0]);axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }});

  2. 下载文件​​​​​​​

    axios.get('/download', { responseType: 'blob' }) .then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'file.pdf'); document.body.appendChild(link); link.click(); });

九、最佳实践

封装 axios:创建 api.js 统一管理接口

环境区分:通过 .env 文件配置不同环境的 baseURL

安全防护:结合 CSRF Token 或 JWT 进行身份验证

性能优化:合理设置超时时间,使用缓存策略

示例:

以下是使用 Axios 和 Spring Boot 实现前后端分离的登录功能的步骤详解:

  1. 后端实现(Spring Boot)

1.1 添加依赖

在 pom.xml 中添加必要依赖:​​​​​​​

复制代码
<!-- Spring Web --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency><!-- 数据库(以 JPA + H2 为例) --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>    <groupId>com.h2database</groupId>    <artifactId>h2</artifactId>    <scope>runtime</scope></dependency><!-- 密码加密 --><dependency>    <groupId>org.springframework.security</groupId>    <artifactId>spring-security-crypto</artifactId></dependency>

1.2 配置数据库和加密

在 application.properties 中配置:​​​​​​​

复制代码
spring.datasource.url=jdbc:h2:mem:testdbspring.datasource.driverClassName=org.h2.Driverspring.h2.console.enabled=truespring.jpa.hibernate.ddl-auto=update

1.3 创建用户实体类​​​​​​​

复制代码
@Entitypublic class User {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @Column(unique = true)    private String username;    private String password;    // Getters and Setters}

1.4 创建 Repository​​​​​​​

复制代码
public interface UserRepository extends JpaRepository<User, Long> {    User findByUsername(String username);}

1.5 创建 Service 层​​​​​​​

复制代码
@Servicepublic class AuthService {    @Autowired    private UserRepository userRepository;    @Autowired    private BCryptPasswordEncoder passwordEncoder;    public boolean authenticate(String username, String password) {        User user = userRepository.findByUsername(username);        return user != null && passwordEncoder.matches(password, user.getPassword());    }}

1.6 创建 Controller​​​​​​​

复制代码
@RestController@RequestMapping("/api/auth")@CrossOrigin(origins = "http://localhost:3000") // 允许前端跨域请求public class AuthController {    @Autowired    private AuthService authService;    @PostMapping("/login")    public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {        boolean isValid = authService.authenticate(            loginRequest.getUsername(),            loginRequest.getPassword()        );        if (isValid) {            return ResponseEntity.ok().body("登录成功");        } else {            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户名或密码错误");        }    }}// 登录请求DTOpublic class LoginRequest {    private String username;    private String password;    // Getters and Setters}
  1. 前端实现(使用 Axios)

2.1 安装 Axios

复制代码
npm install axios

2.2 登录组件示例(React)​​​​​​​

复制代码
import React, { useState } from 'react';import axios from 'axios';const LoginForm = () => {    const [username, setUsername] = useState('');    const [password, setPassword] = useState('');    const [error, setError] = useState('');    const handleSubmit = async (e) => {        e.preventDefault();        try {            const response = await axios.post(                'http://localhost:8080/api/auth/login',                { username, password },                { headers: { 'Content-Type': 'application/json' } }            );            if (response.status === 200) {                alert('登录成功');                // 跳转到主页或处理登录状态            }        } catch (err) {            if (err.response && err.response.status === 401) {                setError('用户名或密码错误');            } else {                setError('登录失败,请重试');            }        }    };    return (        <form onSubmit={handleSubmit}>            <input                type="text"                value={username}                onChange={(e) => setUsername(e.target.value)}                placeholder="用户名"            />            <input                type="password"                value={password}                onChange={(e) => setPassword(e.target.value)}                placeholder="密码"            />            {error && <div className="error">{error}</div>}            <button type="submit">登录</button>        </form>    );};export default LoginForm;
  1. 测试流程

启动 Spring Boot 应用:

复制代码
mvn spring-boot:run

启动前端应用:

复制代码
npm start

在登录页面输入用户名和密码,验证是否返回正确响应。

相关推荐
赵谨言6 小时前
基于Python的Django框架的个人博客管理系统
经验分享·python·毕业设计
Small踢倒coffee_氕氘氚9 小时前
Python实现3D贴图渲染:解锁数字艺术新维度
经验分享·笔记
努力的搬砖人.10 小时前
Vue 2 和 Vue 3 有什么区别
前端·vue.js·经验分享·面试
小顧同學14 小时前
Blender绘图——旋转曲线(以LCP与RCP为例)
经验分享·blender
网络安全宇哥15 小时前
零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
经验分享·安全·web安全·安全架构·waf
百度Geek说20 小时前
秒哒首发即爆发!上线首日吸引2万用户,打造3万应用!
百度
LaughingZhu21 小时前
PH热榜 | 2025-03-30
前端·数据库·人工智能·经验分享·mysql·搜索引擎·产品运营
赵谨言1 天前
基于Python的图书馆信息管理系统研发
经验分享·毕业设计
想要成为计算机高手1 天前
12. STL的原理
开发语言·c++·经验分享·stl