- @PathVariable:用于从URL路径中提取变量。
- @RequestHeader:用于从HTTP请求头中获取数据。
- @ModelAttribute:用于获取请求参数(包括URL参数和POST请求的表单数据),也可以用于将数据绑定到对象上。
- @RequestParam:用于获取URL参数。
- @CookieValue:用于获取请求中的Cookie值。
- @RequestBody:用于获取请求体中的数据,通常用于处理POST请求中的JSON或XML数据。
java代码示例(普通)
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@RequestMapping("/api")
public class DataController {
@GetMapping("/path/{userId}/profile")
public String getPathVariable(@PathVariable String userId) {
return "User ID from Path Variable: " + userId;
}
@GetMapping("/header")
public String getRequestHeader(@RequestHeader("X-Request-ID") String requestId) {
return "Request ID from Header: " + requestId;
}
@PostMapping("/modelAttribute")
public String handleModelAttribute(@ModelAttribute User user) {
return "User Name: " + user.getName() + ", Age: " + user.getAge();
}
@GetMapping("/params")
public String getRequestParam(@RequestParam("name") String name, @RequestParam("age") int age) {
return "Name: " + name + ", Age: " + age;
}
@GetMapping("/cookie")
public String getCookieValue(@CookieValue("session") String sessionCookie) {
return "Session Cookie: " + sessionCookie;
}
@PostMapping("/body")
public String handleRequestBody(@RequestBody User user) {
return "User Name from Body: " + user.getName() + ", Age: " + user.getAge();
}
static class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
测试示例(普通)
- @PathVariable 测试路径:
GET /api/path/123/profile
- @RequestHeader 测试路径:
GET /api/header
请求头中需要包含 X-Request-ID: 12345。
- @ModelAttribute 测试路径:
POST /api/modelAttribute
{
"name": "John Doe",
"age": 30
}
- @RequestParam 测试路径:
GET /api/params?name=John&age=30
- @CookieValue 测试路径:
GET /api/cookie
Cookie: session=abc123
- @RequestBody 测试路径:
POST /api/body
{
"name": "Jane Doe",
"age": 25
}
特殊(传数组)
- 使用 @RequestBody 传递JSON数组
- 如果你使用POST请求并通过请求体传递一个JSON数组,你可以使用@RequestBody注解来接收这个数组。在Spring Boot中,你可以使用HttpEntity或者直接使用@RequestBody来接收数组。
@RestController
@RequestMapping("/api")
public class ListController {
@PostMapping("/list")
public String handleRequestBodyList(@RequestBody List<User> users) {
return "Received " + users.size() + " users";
}
}
POST /api/list
[
{"name": "John Doe", "age": 30},
{"name": "Jane Doe", "age": 25}
]
- 使用 @RequestParam 传递多个相同参数
- 如果你使用GET请求并通过URL参数传递多个相同名称的参数,你可以使用@RequestParam注解来接收这些参数,并将其转换为列表。
@RestController
@RequestMapping("/api")
public class ListController {
@GetMapping("/params")
public String getRequestParamList(@RequestParam("userId") List<String> userIds) {
return "Received user IDs: " + Arrays.toString(userIds.toArray());
}
}
GET /api/params?userId=1&userId=2&userId=3
- 使用 @ModelAttribute 传递表单数据
- 如果你使用POST请求并通过表单数据传递一个列表,你可以使用@ModelAttribute注解来接收这个列表。这通常用于处理表单提交。
@RestController
@RequestMapping("/api")
public class ListController {
@PostMapping("/form")
public String handleModelAttribute(@ModelAttribute List<User> users) {
return "Received " + users.size() + " users";
}
}
POST /api/form
请求体中包含表单数据(使用application/x-www-form-urlencoded):
userId=1&userId=2&userId=3
或者,如果你使用JSON格式的请求体,你需要自定义一个包装类来接收这个列表。
- 使用自定义包装类
- 对于复杂的数据结构,你可以创建一个自定义的包装类来接收列表。
public class UserListWrapper {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
@RestController
@RequestMapping("/api")
public class ListController {
@PostMapping("/custom")
public String handleCustomList(@RequestBody UserListWrapper wrapper) {
return "Received " + wrapper.getUsers().size() + " users";
}
}
POST /api/custom
{
"users": [
{"name": "John Doe", "age": 30},
{"name": "Jane Doe", "age": 25}
]
}