RESTful API简介
RESTful API 是一种基于 HTTP 协议设计的 API 架构风格,遵循资源导向、统一接口、无状态等原则,用于在不同系统间进行高效、灵活的数据交互。以下是详细解释和代码示例:
核心概念与特点
-
资源导向:
- 将数据和功能抽象为 “资源”,每个资源用 URL 标识(如
/users/123)。 - 资源是 RESTful API 的核心,一切操作围绕资源展开。
- 将数据和功能抽象为 “资源”,每个资源用 URL 标识(如
-
统一接口:
- 使用标准 HTTP 方法操作资源:
GET:获取资源POST:创建资源PUT:更新资源(全量)PATCH:更新资源(部分)DELETE:删除资源
- 使用标准 HTTP 方法操作资源:
-
无状态:
- 每个请求独立,不依赖服务器端会话状态。
- 优点:可扩展性强、易于缓存、简化服务器实现。
-
分层系统:
- 客户端无需关心数据来源(如直接访问数据库或经过中间层)。
-
幂等性:
GET、PUT、DELETE操作是幂等的(多次请求效果相同)。POST和PATCH通常不保证幂等性。
RESTful API 的作用
- 前后端分离:使前端(如 Web、App)与后端服务解耦,独立开发。
- 跨平台兼容:通过标准 HTTP 协议,支持多种客户端(浏览器、移动端、第三方应用)。
- 易于缓存:利用 HTTP 缓存机制(如
Cache-Control、ETag)提升性能。 - 可扩展性:通过版本控制、超媒体等机制支持 API 演进。
- 标准化:统一的设计原则降低学习成本,提高开发效率。
代码示例(Spring Boot + Java)
以下是一个使用 Spring Boot 实现的简单 RESTful API,用于管理用户资源:
// User.java(实体类)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
// UserRepository.java(数据访问层)
@Repository
public interface UserRepository {
List<User> findAll();
User findById(Long id);
User save(User user);
void deleteById(Long id);
}
// UserService.java(业务逻辑层)
@Service
public class UserService {
private final UserRepository repository;
@Autowired
public UserService(UserRepository repository) {
this.repository = repository;
}
public List<User> getAllUsers() {
return repository.findAll();
}
public User getUserById(Long id) {
return repository.findById(id);
}
public User createUser(User user) {
// 业务逻辑(如数据验证)
return repository.save(user);
}
public User updateUser(Long id, User updatedUser) {
User existingUser = repository.findById(id);
if (existingUser != null) {
// 更新逻辑
existingUser.setName(updatedUser.getName());
existingUser.setAge(updatedUser.getAge());
existingUser.setEmail(updatedUser.getEmail());
return repository.save(existingUser);
}
return null;
}
public void deleteUser(Long id) {
repository.deleteById(id);
}
}
// UserController.java(API 控制器)
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
// 1. 获取所有用户
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = userService.getAllUsers();
return ResponseEntity.ok(users);
}
// 2. 获取单个用户
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
if (user != null) {
return ResponseEntity.ok(user);
} else {
return ResponseEntity.notFound().build();
}
}
// 3. 创建用户
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User createdUser = userService.createUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}
// 4. 更新用户(全量)
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
User updatedUser = userService.updateUser(id, user);
if (updatedUser != null) {
return ResponseEntity.ok(updatedUser);
} else {
return ResponseEntity.notFound().build();
}
}
// 5. 删除用户
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
对应的 HTTP 请求示例
-
获取所有用户:http
GET /api/users HTTP/1.1 Host: example.com
响应:json[ { "id": 1, "name": "Alice", "age": 30, "email": "alice@example.com" }, { "id": 2, "name": "Bob", "age": 25, "email": "bob@example.com" } ] -
获取单个用户:http
GET /api/users/1 HTTP/1.1 Host: example.com
响应:json{ "id": 1, "name": "Alice", "age": 30, "email": "alice@example.com" } -
创建用户:http
POST /api/users HTTP/1.1 Host: example.com Content-Type: application/json { "name": "Charlie", "age": 35, "email": "charlie@example.com" }
响应(状态码 201 Created):json{ "id": 3, "name": "Charlie", "age": 35, "email": "charlie@example.com" } -
更新用户:http
PUT /api/users/1 HTTP/1.1 Host: example.com Content-Type: application/json { "id": 1, "name": "Alice Smith", "age": 31, "email": "alice@example.com" }
响应:json{ "id": 1, "name": "Alice Smith", "age": 31, "email": "alice@example.com" } -
删除用户:http
DELETE /api/users/1 HTTP/1.1 Host: example.com
响应(状态码 204 No Content)。
RESTful API 设计最佳实践
-
URL 设计:
- 使用名词复数表示资源集合(如
/users)。 - 使用嵌套路径表示资源关系(如
/users/123/orders)。 - 避免动词(如
/getUsers),用 HTTP 方法表达动作。
- 使用名词复数表示资源集合(如
-
状态码:
200 OK:成功处理请求。201 Created:创建资源成功。204 No Content:删除操作成功。400 Bad Request:请求格式错误。401 Unauthorized:未认证。403 Forbidden:权限不足。404 Not Found:资源不存在。500 Internal Server Error:服务器错误。
-
分页与过滤:
- 使用查询参数实现分页(如
?page=1&size=10)。 - 过滤条件(如
?status=active)。
- 使用查询参数实现分页(如
-
版本控制:
- 在 URL 中包含版本号(如
/v1/users)。
- 在 URL 中包含版本号(如
-
错误处理:
- 返回标准化的错误响应(如包含错误码、错误信息)。
-
安全:
- 使用 HTTPS。
- 认证(如 JWT、OAuth)和授权。
与其他 API 风格的对比
| 特性 | RESTful API | SOAP API | GraphQL |
|---|---|---|---|
| 协议 | HTTP | HTTP + XML | HTTP(任意协议) |
| 数据格式 | JSON、XML、HTML 等 | XML | JSON |
| 接口设计 | 资源导向(URL + 方法) | 操作导向(WSDL) | 客户端定义查询 |
| 灵活性 | 适中(需遵循规范) | 低(严格格式) | 高(按需获取数据) |
| 性能 | 较好(轻量) | 一般(XML 开销大) | 优(避免过度获取) |
| 缓存支持 | 原生支持(HTTP 缓存) | 不支持 | 需自定义 |
总结
RESTful API 是现代 Web 服务的主流设计风格,通过标准化的接口和资源导向的理念,使不同系统间的数据交互更加简洁、高效。它广泛应用于微服务架构、前后端分离开发和第三方开放平台中。

浙公网安备 33010602011771号