Spring MVC 提供了一系列注解,用于简化请求数据的获取和处理。了解并掌握这些注解的使用,对于开发RESTful API和处理HTTP请求至关重要。本文将详细介绍 @RequestBody
,@RequestParam
和 @PathVariable
注解,并附带具体的代码示例,帮助开发者更好地理解它们的用途和使用方法。
1. @RequestBody 注解
1.1 注解说明
@RequestBody
用于将 HTTP 请求体中的数据绑定到方法参数上。常用于接收 JSON 或 XML 格式的数据并将其转换为对应的 Java 对象。Spring MVC 使用消息转换机制(MessageConverter)将请求体的数据转换为 Java 对象。
1.2 使用场景
- 接收客户端发送的 JSON 数据。
- 处理复杂的数据结构,如嵌套对象等。
1.3 具体代码示例
1.3.1 接收简单对象
假设我们有一个简单的 User
类:
java
public class User { private String name; private int age; // Getters and Setters }
控制器方法如下:
java
@RestController public class UserController { @PostMapping("/user") public ResponseEntity<User> createUser(@RequestBody User user) { // 处理逻辑 // 假设这里我们只是返回接收到的用户信息 return new ResponseEntity<>(user, HttpStatus.OK); } }
请求示例:
bash
curl -X POST -H "Content-Type: application/json" -d '{"name": "John Doe", "age": 25}' http://localhost:8080/user
1.3.2 接收复杂对象
假设我们有一个复杂的 Order
对象,其中包含一个 User
和多个 Item
:
java
public class Item { private String name; private double price; // Getters and Setters } public class Order { private User customer; private List<Item> items; // Getters and Setters }
控制器方法如下:
java
@RestController public class OrderController { @PostMapping("/order") public ResponseEntity<Order> createOrder(@RequestBody Order order) { // 处理逻辑 // 假设这里我们只是返回接收到的订单信息 return new ResponseEntity<>(order, HttpStatus.OK); } }
请求示例:
bash
curl -X POST -H "Content-Type: application/json" -d '{ "customer": {"name": "John Doe", "age": 25}, "items": [{"name": "Item1", "price": 19.99}, {"name": "Item2", "price": 5.99}] }' http://localhost:8080/order
2. @RequestParam 注解
2.1 注解说明
@RequestParam
用于将请求参数(如 URL 中的查询参数)绑定到方法参数上。它支持默认值和必需参数的设置,可以处理单个参数和参数列表。
2.2 使用场景
- 处理 URL 中的查询参数。
- 处理表单数据(application/x-www-form-urlencoded)。
2.3 具体代码示例
2.3.1 获取单个请求参数
java
@RestController public class GreetingController { @GetMapping("/greeting") public ResponseEntity<String> greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name) { return new ResponseEntity<>("Hello, " + name, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/greeting?name=John
返回结果:
Hello, John
未指定参数时使用默认值:
bash
curl http://localhost:8080/greeting
返回结果:
Hello, World
2.3.2 获取多个请求参数
java
@RestController public class SearchController { @GetMapping("/search") public ResponseEntity<String> search(@RequestParam String keyword, @RequestParam int page) { return new ResponseEntity<>("Searching for " + keyword + " on page " + page, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/search?keyword=Spring&page=2
返回结果:
Searching for Spring on page 2
2.3.3 获取参数列表
java
@RestController public class FilterController { @GetMapping("/filter") public ResponseEntity<String> filter(@RequestParam List<String> categories) { return new ResponseEntity<>("Filtering categories: " + String.join(", ", categories), HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/filter?categories=books&categories=electronics&categories=clothes
返回结果:
Filtering categories: books, electronics, clothes
3. @PathVariable 注解
3.1 注解说明
@PathVariable
用于将 URL 路径中的动态部分绑定到方法参数上。它支持多种类型,包括基本数据类型和自定义类型。
3.2 使用场景
- 处理 RESTful 风格的 URL 路径参数。
- 清晰地表示资源之间的层次结构和关系。
3.3 具体代码示例
3.3.1 使用单个路径变量
java
@RestController public class UserController { @GetMapping("/users/{id}") public ResponseEntity<String> getUser(@PathVariable("id") Long userId) { return new ResponseEntity<>("User ID: " + userId, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/users/42
返回结果:
User ID: 42
3.3.2 使用多个路径变量
java
@RestController public class OrderController { @GetMapping("/users/{userId}/orders/{orderId}") public ResponseEntity<String> getOrder(@PathVariable Long userId, @PathVariable Long orderId) { return new ResponseEntity<>("User ID: " + userId + ", Order ID: " + orderId, HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/users/42/orders/101
返回结果:
User ID: 42, Order ID: 101
3.3.3 使用路径变量和请求参数
java
@RestController public class ProductController { @GetMapping("/products/{productId}") public ResponseEntity<String> getProduct(@PathVariable Long productId, @RequestParam(required = false) String version) { if (version == null) { return new ResponseEntity<>("Product ID: " + productId, HttpStatus.OK); } return new ResponseEntity<>("Product ID: " + productId + " (version: " + version + ")", HttpStatus.OK); } }
请求示例:
bash
curl http://localhost:8080/products/123?version=2
返回结果:
Product ID: 123 (version: 2)