请求响应
2025年12月27日大约 4 分钟
请求响应
概述
在前面Web入门我们提到了Tomcat服务器是可以识别Servlet的,实际上SpringBoot底层也是基于Servlet来处理HTTP请求的。
了解
SpringBoot通过DispatcherServlet(前端控制器)来接收和处理HTTP请求,并将请求分发给相应的控制器(Controller)进行处理。
- 当浏览器发起请求时,会先经过Tomcat服务器,对请求数据进行解析封装为
HttpServletRequest对象,然后由DispatcherServlet接收请求并进行处理,最后给Controller层。 - Controller处理完请求后,会将结果封装为
HttpServletResponse对象返回给DispatcherServlet,再由DispatcherServlet将响应数据发送回浏览器。
请求响应:
- 请求对象(HttpServletRequest):获取请求数据。
- 响应对象(HttpServletResponse):封装响应数据。
请求
获取简单参数
简单参数指数据类型简单的参数,例如 http://localhost:8080/greet?name=John, 其中name就是一个简单参数。同样如果是POST请求,参数也可以通过请求体传递。
- 接收方式(参数名一致):请求参数名与方法参数名一致,即可接收参数。
@GetMapping("/greet")
public String greet(String name) {
return "Hello, " + name + "!";
}- 注意:如果参数名不一致,可以使用
@RequestParam注解来指定参数名。
@GetMapping("/greet")
public String greet(@RequestParam("name") String userName) {
return "Hello, " + userName + "!";
}注意
@RequestParam注解的required属性默认为true,表示该参数是必须的。如果请求中没有提供该参数,会抛出异常。可以将其设置为false,表示参数可选。
获取实体参数
实体参数指的是通过请求参数封装成一个对象,例如 http://localhost:8080/user?name=John&age=30, 其中name和age可以封装成一个User对象。
- 接收实体参数时,只要请求参数名和方法参数对应的实体类属性名一致,Spring会自动将请求参数封装到实体对象中。
简单实体对象
- 定义实体类:
@Data
public class User {
private String name;
private int age;
}- 接收方式:直接在方法参数中使用实体类类型,Spring会自动将请求参数封装到该对象中。并且请求参数名需要和实体类的属性名一致。
@GetMapping("/user")
public String getUser(User user) {
return "User: " + user.getName() + ", Age: " + user.getAge();
}复杂实体对象
- 如果请求中传递的实体对象有另一个对象,例如
http://localhost:8080/order?orderId=123&user.name=John&user.age=30, 其中user是一个复杂对象。 - 定义实体类:
// User 实体类
@Data
public class User {
private String name;
private int age;
}
// Order 实体类
@Data
public class Order {
private String orderId;
private User user;
}- 接收方式:同样在方法参数中使用复杂实体类类型,Spring会自动将请求参数封装到该对象中。并且请求参数名需要和实体类的属性名一致,包括嵌套对象的属性名。
@GetMapping("/order")
public String getOrder(Order order) {
User user = order.getUser();
return "Order ID: " + order.getOrderId() + ", User: " + user.getName() + ", Age: " + user.getAge();
}获取数组和集合参数
数组参数
- 请求示例:
http://localhost:8080/numbers?nums=1&nums=2&nums=3 - 接收方式:在方法参数中使用数组类型,Spring会自动将请求参数封装到数组中。
@GetMapping("/numbers")
public String getNumbers(int[] nums) {
return "Numbers: " + Arrays.toString(nums);
}集合参数
- 请求示例:
http://localhost:8080/names?names=Alice&names=Bob&names=Charlie - 接收方式:在方法参数中使用
List类型,并使用@RequestParam绑定参数关系,Spring会自动将请求参数封装到集合中。
@GetMapping("/names")
public String getNames(@RequestParam List<String> names) {
return "Names: " + names;
}获取日期参数
- 请求示例:
http://localhost:8080/date?date=2024-06-15 20:30:00 - 接收方式:使用
@DateTimeFormat注解来指定日期格式。
@GetMapping("/date")
public String getDate(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date) {
return "Date: " + date;
}获取Json参数
- 请求示例:发送POST请求,Content-Type为application/json,Body为
{"name": "John", "age": 30} - 接收方式:使用
@RequestBody注解将请求体中的JSON数据映射到实体对象中。
@PostMapping("/json")
public String getJson(@RequestBody User user) {
return "User: " + user.getName() + ", Age: " + user.getAge();
}获取路径参数
- 请求示例:
http://localhost:8080/user/123, 其中123是用户ID。 - 接收方式:先在请求路径中使用
{xx}定义路径变量,然后在方法参数中使用@PathVariable注解绑定路径变量。
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") String userId) {
return "User ID: " + userId;
}响应
SpringBoot响应数据,主要是通过@ResponseBody注解来实现的。
@ResponseBody
- 类型:方法、类注解
- 位置:可以标注在Controller类上,也可以标注在具体的方法上。
- 作用:将方法的返回值作为HTTP响应体返回给浏览器,如果返回值类型是 实体对象/集合,会自动将其转换为JSON格式。
- 注意:在使用
@RestController注解时,默认所有方法都会应用@ResponseBody的效果,因此不需要单独添加@ResponseBody注解。
统一响应结果
为了响应结果的规范和统一,一般会定义一个统一的响应结果。