在API开发中(如Spring Boot),请求参数可以通过不同方式传递,对应不同的注解获取。以下是 Header参数、Body参数、Path参数、Query参数 的区别及对应的注解:
Header 参数
• 含义:通过HTTP请求头(Headers)传递的参数,通常用于认证(如Authorization)、客户端信息(如User-Agent)等。
• 示例:
GET /api/user HTTP/1.1
Authorization: Bearer xxxx
• Spring注解:
• @RequestHeader:获取单个Header值。
• @RequestHeader Map<String, String>:获取所有Headers。
• 代码示例:
@GetMapping("/user")
public String getUser(@RequestHeader("Authorization") String token) {
return "Token: " + token;
}
Body 参数
• 含义:通过HTTP请求体(Body)传递的参数,通常用于提交JSON/XML格式的复杂数据(如创建资源)。
• 示例:
POST /api/user HTTP/1.1
Content-Type: application/json
{"name": "Alice", "age": 25}
• Spring注解:
• @RequestBody:将请求体反序列化为Java对象(需指定Content-Type为application/json)。
• 代码示例:
@PostMapping("/user")
public User createUser(@RequestBody User user) {
return userService.save(user);
}
Path 参数
• 含义:通过URL路径传递的参数(RESTful风格),用于标识资源(如用户ID)。
• 示例:
GET /api/user/123
• Spring注解:
• @PathVariable:从URL模板中提取变量值。
• 代码示例:
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
Query 参数
• 含义:通过URL问号后拼接的参数(?key=value),用于过滤、分页等非必选参数。
• 示例:
GET /api/user?name=Alice&age=25
• Spring注解:
• @RequestParam:获取单个Query参数。
• @RequestParam Map<String, String>:获取所有Query参数。
• @RequestParam(required = false):标记参数为可选。
• 代码示例:
@GetMapping("/user")
public List<User> searchUsers(
@RequestParam String name,
@RequestParam(required = false) Integer age
) {
return userService.search(name, age);
}
总结对比表
参数类型 |
传递方式 |
典型用途 |
Spring注解 |
Header |
HTTP请求头 |
认证、客户端信息 |
@RequestHeader |
Body |
HTTP请求体(JSON/XML) |
提交复杂数据 |
@RequestBody |
Path |
URL路径(如/user/1) |
标识资源 |
@PathVariable |
Query |
URL问号后(?name=xx) |
过滤、分页等可选参数 |
@RequestParam |
其他注意事项
- 混合使用:一个接口可以同时使用多种参数类型(如Path + Query + Header)。
@PutMapping("/user/{id}")
public User updateUser(
@PathVariable Long id,
@RequestBody User user,
@RequestHeader("X-Request-From") String source
) { ... }
- 默认值:@RequestParam和@RequestHeader支持设置默认值:
@RequestParam(defaultValue = "1") int page
- RESTful设计:优先使用Path参数标识资源,Query参数用于辅助操作(如排序、搜索)。