后端接受请求参数方法(重点)
发布时间:2024-12-18 19:44:58
获取请求参数方法(重点)
在 Spring Boot 中,处理请求参数有多种方式。以下是常用的方式、每种方式的扩展用法、注意事项,以及适用场景的详细解释。
请求方式注解
@RequestParam:用于处理查询参数和表单参数
基本用法:
java
@GetMapping("/user")
public String getUser(@RequestParam(name = "name") String username,
@RequestParam(name = "age", required = false, defaultValue = "18") Integer age) {
return username + " is " + age + " years old";
}
说明:
name: 查询参数的名称。
required: 是否为必传参数,默认为 true。
defaultValue: 指定参数的默认值,当参数缺失或为空时使用该值。
注意事项:
必填参数:如果 required 为 true 且缺少参数,会抛出 MissingServletRequestParameterException。
类型转换:Spring 自动将字符串转换为 Integer、Boolean 等类型,但参数类型不匹配时会抛出异常。
扩展用法:可以处理数组和集合参数,如 @RequestParam List<String> tags 用于获取 ?tags=tag1&tags=tag2。
@PathVariable:用于处理URL 路径参数
基本用法:
java
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") Long userId) {
return "User ID: " + userId;
}
说明:
@PathVariable 用于从请求路径中提取参数,将 /{id} 中的 id 匹配到方法参数 userId 上。
注意事项:
路径匹配:@PathVariable 的名称必须与 URL 中的变量名匹配,或者使用 @PathVariable("path变量名") 显式指定。
可选参数:@PathVariable 本身不支持默认值,如果路径参数可选,建议用正则来匹配不同 URL 格式。
@RequestBody:用于接收JSON、XML等格式的请求体
基本用法:
java
@PostMapping("/user")
public String createUser(@RequestBody User user) {
return "User Created: " + user.getName();
}
说明:
@RequestBody 将请求体(JSON/XML 等)自动映射到对象,支持 POST、PUT 请求。
注意事项:
格式要求:@RequestBody 仅适用于 Content-Type 为 application/json 或 application/xml 的请求。
参数验证:结合 @Valid 注解,可以进行数据校验。
支持集合类型:可以用 List<User> 等集合类型作为 @RequestBody 参数。
@ModelAttribute:用于绑定表单数据或查询参数到对象
基本用法:
java
@PostMapping("/user")
public String saveUser(@ModelAttribute User user) {
return "User saved with name: " + user.getName();
}
说明:
@ModelAttribute 自动绑定查询参数或表单参数到指定对象,适用于获取多个字段的请求参数。
注意事项:
数据绑定:@ModelAttribute 会从请求体、查询参数和表单数据中寻找匹配的字段。
适用场景:适合从 POST 表单或 GET 查询参数中接收数据。
默认值:字段缺失时,属性使用默认值或指定值。
HttpServletRequest 和 HttpServletResponse:直接使用原生请求和响应对象
基本用法:
java
@GetMapping("/user")
public String getUser(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("name");
return "Hello " + username;
}
说明:
使用 HttpServletRequest 和 HttpServletResponse 可以直接操作请求和响应,适合低级别操作。
注意事项:
手动解析:需要手动解析请求参数,不如 @RequestParam 等注解简洁。
适用场景:适合复杂请求解析和需要直接操作 HttpServletResponse 的场景,例如文件下载。
@RequestHeader:用于处理请求头
基本用法:
java
@GetMapping("/user-agent")
public String getUserAgent(@RequestHeader("User-Agent") String userAgent) {
return "User-Agent: " + userAgent;
}
说明:
@RequestHeader 注解用于获取请求头的值。
注意事项:
必填参数:默认 required=true,如果请求头缺失,会抛出 MissingRequestHeaderException。
默认值:可通过 defaultValue 设置默认值,避免请求头缺失时出错。
@CookieValue:用于处理Cookie
基本用法:
java
@GetMapping("/cookie")
public String getCookie(@CookieValue(value = "sessionId", defaultValue = "") String sessionId) {
return "Session ID: " + sessionId;
}
说明:
@CookieValue 获取指定的 Cookie 值,适合需要从 Cookie 中提取信息的场景。
注意事项:
默认值:同样可以设置 defaultValue,避免 Cookie 缺失时出错。
作用域:仅限于从请求的 Cookie 中提取数据,与 @RequestHeader 类似。
总结与适用场景
| 注解 | 说明 | 适用场景 |
| -------------------- | ---------------------------- | ------------------ |
| @RequestParam | 从查询参数或表单参数获取数据 | 简单查询参数、表单 |
| @PathVariable | 从 URL 路径中提取参数 | RESTful URL |
| @RequestBody | 将请求体映射为对象 | JSON、XML 数据 |
| @ModelAttribute | 将参数绑定到对象 | 多字段表单 |
| HttpServletRequest | 直接访问请求、响应对象 | 自定义解析 |
| @RequestHeader | 从请求头中获取数据 | 获取头信息 |
| @CookieValue | 从 Cookie 中获取数据 | 需要 Cookie 数据 |
不同注解适合不同的场景,选择合适的注解可以简化代码并提高可读性。
接受数组参数
好的,以下是使用实体类接收数组参数的重点示例,并说明了实现方法和注意事项。
实现示例:用实体类接收数组参数
假设我们要接收一个用户信息,其中包括用户名、年龄和一个包含多个兴趣爱好的数组。
创建实体类
创建一个 User 类,包含 username、age 和 hobbies 字段,其中 hobbies 字段用于接收数组数据。
```java
import java.util.List;
public class User {
private String username;
private Integer age;
private List hobbies; // 用于接收多个兴趣爱好
// Getters 和 Setters
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
public List<String> getHobbies() { return hobbies; }
public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
}
```
控制器方法
在控制器中创建一个方法,使用 @RequestBody 接收 JSON 格式的请求体,并将数据绑定到 User 实体上。
```java
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/register")
public String registerUser(@RequestBody User user) {
// 输出用户的兴趣爱好列表
System.out.println("Username: " + user.getUsername());
System.out.println("Age: " + user.getAge());
System.out.println("Hobbies: " + user.getHobbies());
return "User Registered Successfully";
}
}
```
前端发送 JSON 请求
让前端发送一个 JSON 格式的请求,包含 username、age 和一个兴趣爱好数组 hobbies。
示例 JSON 请求体:
json
{
"username": "john_doe",
"age": 25,
"hobbies": ["reading", "swimming", "gaming"]
}
使用 Postman 或前端代码发送请求:
javascript
fetch('/user/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username: 'john_doe',
age: 25,
hobbies: ['reading', 'swimming', 'gaming']
})
}).then(response => response.text())
.then(data => console.log(data));
运行结果
控制台输出:
Username: john_doe
Age: 25
Hobbies: [reading, swimming, gaming]
返回结果:
User Registered Successfully
注意事项
注解选择:当使用 JSON 格式请求时,使用 @RequestBody。若参数来自 URL 查询或表单,可使用 @RequestParam 或 @ModelAttribute。
字段类型:确保 hobbies 的类型匹配请求数据类型(如 List<String> 或 String[])。
空值处理:注意空值或字段缺失情况,使用默认值或 @NotNull 等校验注解。
数据校验:使用 @Valid 和 @Size 注解进行校验,确保 hobbies 的大小在合理范围内。
在 Spring Boot 中接受日期时间类参数,可以使用以下几种常见方式,并注意相应的日期格式转换。下面是常见的日期时间处理方式和示例代码:
接受日期参数
1. 使用 @RequestParam 接收日期时间参数
可以在控制器方法参数中使用 @RequestParam 来接收日期时间参数。为了避免格式问题,使用 @DateTimeFormat 注解指定日期格式。
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/event")
public class EventController {
@GetMapping("/getEvent")
public String getEvent(
@RequestParam("eventDate")
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime eventDate) {
// 示例格式:2024-11-01T14:30:00
System.out.println("Event Date: " + eventDate);
return "Event Date received";
}
}
注意事项:
使用 @DateTimeFormat 来指定日期格式,例如 "yyyy-MM-dd" 或 "yyyy-MM-dd'T'HH:mm:ss".
LocalDate 仅包含日期,不包括时间;LocalDateTime 包含日期和时间。
2. 使用 @RequestBody 接收 JSON 日期时间参数
在 JSON 请求中,如果实体类中包含日期时间字段,Spring Boot 会自动将 JSON 格式的日期时间转换为 LocalDate 或 LocalDateTime。需要确保 JSON 格式与日期格式匹配,或者使用 @JsonFormat 来指定格式。
示例:创建实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
public class Event {
private String name;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate eventDate;
// Getters 和 Setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public LocalDate getEventDate() { return eventDate; }
public void setEventDate(LocalDate eventDate) { this.eventDate = eventDate; }
}
控制器方法
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/event")
public class EventController {
@PostMapping("/create")
public String createEvent(@RequestBody Event event) {
System.out.println("Event Name: " + event.getName());
System.out.println("Event Date: " + event.getEventDate());
return "Event created successfully";
}
}
示例 JSON 请求体
{
"name": "Conference",
"eventDate": "2024-11-01"
}
3. 使用 PathVariable 接收日期时间参数
如果日期参数在 URL 路径中,可以结合 @DateTimeFormat 和 @PathVariable 一起使用。
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
@RestController
@RequestMapping("/event")
public class EventController {
@GetMapping("/find/{eventDate}")
public String findEventByDate(
@PathVariable("eventDate")
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate eventDate) {
System.out.println("Finding event on: " + eventDate);
return "Event found";
}
}
注意事项
日期格式需要与 @DateTimeFormat 指定的格式完全匹配,否则会导致格式转换异常。
常见注意事项
日期格式统一:确保在前端和后端使用相同的日期格式,以避免格式不匹配。
空值处理:日期时间字段如果可能为空,可以在实体类字段上使用 @NotNull 或 @Nullable 处理。
时间时区:Spring Boot 默认时区可能是 UTC,确保在应用中统一时区配置。