后端接受请求参数方法(重点)

发布时间: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,确保在应用中统一时区配置。