Java 生态系统拥有非常成熟和丰富的工具来构建 RESTful API,从传统的 Java EE (Jakarta EE) 到现代的 Spring 框架,选择非常多。Spring Boot 是绝对的主流和首选,因为它极大地简化了开发过程。

下面我将从核心概念、主流技术栈、详细实践(以 Spring Boot 为例)以及最佳实践几个方面来为你详细讲解。
核心概念回顾
在开始代码之前,我们先快速回顾一下 RESTful API 的核心原则,这对于用任何语言编写 API 都至关重要。
- REST (Representational State Transfer):一种软件架构风格,而不是标准。
- 资源:API 的核心,在 URI 中,名词通常代表资源,
/users,/products/123。 - HTTP 方法:用于对资源进行操作。
GET: 获取资源 (查询)POST: 创建新资源 (创建)PUT: 全量更新资源 (更新)PATCH: 部分更新资源 (更新)DELETE: 删除资源 (删除)
- 无状态:服务器不保存客户端的状态,每个请求都必须包含处理该请求所需的所有信息,通常通过认证令牌(如 JWT)实现。
- 统一接口:使用标准的 HTTP 状态码和消息格式(通常是 JSON)。
Java 主流 RESTful API 技术栈
| 技术栈 | 描述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| Spring Boot | 当前绝对主流,基于 Spring 框架,用于快速创建独立、生产级 Spring 应用。 | 极其简化配置、自动配置、内嵌服务器(Tomcat, Jetty)、强大的社区生态、完美的整合能力(如 Spring Data JPA, Security)。 | 学习曲线相对陡峭(但一旦上手,效率极高)。 | 几乎所有类型的 Java Web 应用,尤其是微服务、企业级应用。 |
| Jakarta EE / Java EE | Java 的官方企业级平台规范。 | 标准化、由 Oracle 主导、稳定可靠。 | 配置繁琐、需要应用服务器(如 WildFly, WebLogic)、开发体验不如 Spring Boot。 | 传统的大型企业应用、银行、金融等对稳定性要求极高的领域。 |
| JAX-RS (Jakarta RESTful Web Services) | Java EE 中定义 RESTful API 的标准规范,实现有 Jersey, RESTeasy 等。 | 标准、灵活、可以脱离 Spring 框架使用。 | 通常需要搭配 Java EE 的其他部分(如 EJB, JPA),配置依然较多。 | 在已经使用 Java EE 技术栈的项目中,或者希望避免 Spring 依赖的场景。 |
| Micronaut | 一个现代化的、为云原生和 Serverless 设计的 JVM 框架。 | 启动速度快、低内存消耗、优秀的 AOT(Ahead-of-Time)编译支持,适合 Serverless。 | 生态系统和社区规模远小于 Spring Boot。 | Serverless 函数、微服务、需要极快冷启动时间的应用。 |
| Quarkus | 类似 Micronaut,也是一个为 GraalVM 和 OpenJDK HotSpot 优化的全栈 Java 框架。 | 极致的性能和低内存占用,优秀的开发者体验(Live Reload)。 | 同样,生态系统和社区规模小于 Spring Boot。 | 云原生、微服务、需要极致性能和资源效率的场景。 |
对于新项目,尤其是如果你是 Java 开发者,Spring Boot 是不二之选。 本教程将主要围绕 Spring Boot 展开。
使用 Spring Boot 构建 RESTful API (实战)
我们将一步步创建一个简单的 "用户管理" RESTful API。

1 环境准备
- JDK 17 或更高版本
- Maven 或 Gradle (构建工具)
- IDE (如 IntelliJ IDEA 或 VS Code)
- API 测试工具 (如 Postman, Insomnia, 或
curl命令)
2 创建项目
最简单的方式是使用 Spring Initializr (https://start.spring.io/)
- Project: Maven Project
- Language: Java
- Spring Boot: 选择一个稳定版本 (如 3.x.x)
- Project Metadata:
- Group:
com.example - Artifact:
restful-api-demo - Name:
restful-api-demo - Description: Demo project for Spring Boot
- Package name:
com.example.restfulapidemo
- Group:
- Dependencies:
Spring Web: 用于构建 Web 应用,包括 RESTful APIs。Spring Data JPA: 用于简化数据库访问。H2 Database: 一个内存数据库,方便快速开发和测试。Lombok(可选): 通过注解减少样板代码(getter, setter, constructor 等)。
点击 "Generate" 下载项目压缩包,然后用你的 IDE 打开。
3 项目结构
解压后,你会看到类似这样的结构:
restful-api-demo/
├── pom.xml
└── src/
└── main/
├── java/
│ └── com/
│ └── example/
│ └── restfulapidemo/
│ └── RestfulApiDemoApplication.java
└── resources/
└── application.properties
4 创建数据模型
创建一个 User 类来表示我们的资源。
src/main/java/com/example/restfulapidemo/model/User.java
package com.example.restfulapidemo.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data // Lombok: 自动生成 getter, setter, toString, equals, hashCode
@NoArgsConstructor // Lombok: 自动生成无参构造器
@Entity // JPA: 标记这是一个数据库实体
public class User {
@Id // JPA: 标记为主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // JPA: 主键生成策略
private Long id;
private String name;
private String email;
}
5 创建数据访问层
创建一个 UserRepository 接口,Spring Data JPA 会自动为我们实现它。
src/main/java/com/example/restfulapidemo/repository/UserRepository.java
package com.example.restfulapidemo.repository;
import com.example.restfulapidemo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Spring Data JPA 会自动提供 CRUD 方法,如 findAll(), findById(), save(), deleteById() 等
// 我们可以在这里定义自定义查询方法,
// Optional<User> findByEmail(String email);
}
6 创建服务层 (可选但推荐)
为了分离业务逻辑和数据访问,我们通常加一个服务层。
src/main/java/com/example/restfulapidemo/service/UserService.java
package com.example.restfulapidemo.service;
import com.example.restfulapidemo.model.User;
import com.example.restfulapidemo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class UserService {
@Autowired // 依赖注入
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
public Optional<User> getUserById(Long id) {
return userRepository.findById(id);
}
public User createUser(User user) {
return userRepository.save(user);
}
public Optional<User> updateUser(Long id, User userDetails) {
return userRepository.findById(id).map(user -> {
user.setName(userDetails.getName());
user.setEmail(userDetails.getEmail());
return userRepository.save(user);
});
}
public boolean deleteUser(Long id) {
if (userRepository.existsById(id)) {
userRepository.deleteById(id);
return true;
}
return false;
}
}
7 创建控制器
这是 API 的入口,负责处理 HTTP 请求并返回响应。
src/main/java/com/example/restfulapidemo/controller/UserController.java
package com.example.restfulapidemo.controller;
import com.example.restfulapidemo.model.User;
import com.example.restfulapidemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController // @Controller + @ResponseBody,表示所有方法都返回 JSON/XML
@RequestMapping("/api/v1/users") // 定义基础路径
public class UserController {
@Autowired
private UserService userService;
// GET /api/v1/users -> 获取所有用户
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
// GET /api/v1/users/1 -> 根据 ID 获取单个用户
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userService.getUserById(id)
.map(ResponseEntity::ok) // 如果找到,返回 200 OK
.orElse(ResponseEntity.notFound().build()); // 如果没找到,返回 404 Not Found
}
// POST /api/v1/users -> 创建新用户
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return new ResponseEntity<>(createdUser, HttpStatus.CREATED); // 返回 201 Created
}
// PUT /api/v1/users/1 -> 全量更新用户
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
return userService.updateUser(id, userDetails)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
// DELETE /api/v1/users/1 -> 删除用户
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
if (userService.deleteUser(id)) {
return ResponseEntity.noContent().build(); // 返回 204 No Content
} else {
return ResponseEntity.notFound().build();
}
}
}
8 配置数据库
在 src/main/resources/application.properties 中添加 H2 数据库配置。
# Server Port server.port=8080 # H2 Database Configuration spring.h2.console.enabled=true # 启动 H2 控制台 spring.datasource.url=jdbc:h2:mem:testdb # 内存数据库 spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= # JPA/Hibernate Configuration spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=update # 自动更新数据库结构
9 运行和测试
-
运行应用:在 IDE 中运行
RestfulApiDemoApplication.java的main方法。 -
测试 API:
-
创建用户 (POST): 使用
curl或 Postman 发送POST请求到http://localhost:8080/api/v1/users// 请求体 (Body) { "name": "Alice", "email": "alice@example.com" }响应:
{ "id": 1, "name": "Alice", "email": "alice@example.com" } -
获取所有用户 (GET): 发送
GET请求到http://localhost:8080/api/v1/users响应:[ { "id": 1, "name": "Alice", "email": "alice@example.com" } ] -
获取单个用户 (GET): 发送
GET请求到http://localhost:8080/api/v1/users/1响应:{ "id": 1, "name": "Alice", "email": "alice@example.com" } -
更新用户 (PUT): 发送
PUT请求到http://localhost:8080/api/v1/users/1,并更新请求体。{ "name": "Alice Smith", "email": "alice.smith@example.com" } -
删除用户 (DELETE): 发送
DELETE请求到http://localhost:8080/api/v1/users/1响应状态码为204 No Content。
-
RESTful API 最佳实践
- 使用名词复数表示资源集合:如
/users,/products。 - 使用 HTTP 动词表示操作:如
GET /users,POST /users。 - 版本控制:在 URL 中包含 API 版本,如
/api/v1/users。 - 使用合适的 HTTP 状态码:
200 OK: 成功的 GET, PUT, PATCH201 Created: 成功的 POST204 No Content: 成功的 DELETE400 Bad Request: 请求格式错误401 Unauthorized: 未认证403 Forbidden: 权限不足404 Not Found: 资源不存在500 Internal Server Error: 服务器内部错误
- 统一的响应格式:设计一个标准的响应结构,包含状态码、消息、数据等。
{ "status": "success", "data": { ... }, "message": "User created successfully" } - 过滤、排序、分页:通过查询参数实现,如
GET /users?sort=name,desc&page=0&size=10。 - 安全性:始终使用 HTTPS,实现认证和授权机制(如 Spring Security + JWT)。
- 文档化:使用 Swagger (OpenAPI) 等工具自动生成 API 文档,方便前端开发者使用。
Java 生态为构建 RESTful API 提供了强大而灵活的工具。Spring Boot 凭借其“约定优于配置”的理念和强大的整合能力,成为了现代 Java Web 开发的标准,通过 Spring MVC、Spring Data JPA 等模块,你可以非常快速和高效地构建出符合 RESTful 风格、结构清晰、易于维护的后端服务。
