在Java后端开发中,HTTP请求的不同部分需要使用不同的注解来处理。以下是四种主要请求参数类型及其对应的Spring注解:
1. 请求头(Headers)
位置:HTTP请求的头部信息
常用场景:认证信息(Token)、客户端信息、内容类型等
Spring注解:
@RequestHeader
- 获取单个请求头@RequestHeader Map<String, String>
- 获取所有请求头
@GetMapping("/example")
public ResponseEntity<?> example(
@RequestHeader("Authorization") String authToken,
@RequestHeader Map<String, String> headers) {
// 使用authToken和headers
}
2. 请求体(Body)
位置:HTTP请求的主体内容
常用场景:POST/PUT请求的JSON/XML数据
Spring注解:
@RequestBody
- 将请求体反序列化为Java对象
@PostMapping("/users")
public ResponseEntity<User> createUser(
@RequestBody UserCreateDTO userDTO) {
// 处理userDTO
}
3. 路径参数(Path Variables)
位置:URL路径中的变量部分
常用场景:RESTful API的资源标识
Spring注解:
@PathVariable
- 获取路径中的变量
@GetMapping("/users/{userId}")
public ResponseEntity<User> getUser(
@PathVariable Long userId) {
// 根据userId查询用户
}
4. 查询参数(Query Parameters)
位置:URL中
?
后面的键值对常用场景:过滤条件、分页参数等
Spring注解:
@RequestParam
- 获取单个查询参数@RequestParam Map<String, String>
- 获取所有查询参数@RequestParam(required = false)
- 可选参数@RequestParam(defaultValue = "default")
- 带默认值
@GetMapping("/products")
public ResponseEntity<List<Product>> getProducts(
@RequestParam String category,
@RequestParam(required = false) String sortBy,
@RequestParam(defaultValue = "1") int page) {
// 根据参数查询产品
}
综合使用示例
@RestController
@RequestMapping("/api/v1")
public class UserController {
@PutMapping("/users/{id}/status")
public ResponseEntity<?> updateUserStatus(
@PathVariable Long id,
@RequestHeader("X-Auth-Token") String token,
@RequestBody StatusUpdateDTO updateDTO,
@RequestParam(defaultValue = "false") boolean notify) {
// 验证token
// 更新用户状态
// 如果需要则发送通知
return ResponseEntity.ok().build();
}
}
其他相关注解
@ModelAttribute
用于绑定请求参数到命令对象
常用于表单提交
@CookieValue
用于获取Cookie值
参数校验注解(需配合
@Valid
使用)@NotNull
,@Size
,@Pattern
等
最佳实践建议
RESTful API设计:
资源标识用路径参数(
@PathVariable
)过滤条件用查询参数(
@RequestParam
)创建/更新数据用请求体(
@RequestBody
)
安全性:
敏感信息(如认证token)应放在请求头
不要用GET请求发送敏感数据
可读性:
参数名要有意义
可选参数要设置
required=false
或默认值
版本控制:
建议在请求头或路径中包含API版本信息
这些注解是Spring MVC/WebFlux中最常用的参数绑定方式,掌握它们可以高效地处理各种HTTP请求。