目录
1.通过query方式-?
http:localhost:8080/XXX?id=3
在Spring Boot中,前端通过query
参数的方式传递数据到后端时,后端可以通过以下几种方式来接收数据:
1. 1使用 @RequestParam
如果你需要获取单个或多个查询参数,可以使用 @RequestParam
注解。
@RestController
@RequestMapping("/api")
public class YourController {
@GetMapping("/getData")
public String getData(@RequestParam String param1, @RequestParam(required = false) Integer param2) {
// 处理接收到的参数
return "Received param1: " + param1 + ", param2: " + param2;
}
}
在上面的例子中,param1
和 param2
是前端传递的查询参数。
在Spring Boot中,@RequestParam
并不是必须标注的。如果省略 @RequestParam
注解,Spring Boot 也能够通过方法参数的名称匹配查询参数,但需要满足以下条件:
-
必须开启
spring.mvc.parameter-naming-strategy
: 在配置文件中设置spring.mvc.parameter-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
,这样可以将请求参数的命名策略从驼峰命名转换为下划线命名。 -
参数名称必须与查询参数名称匹配: 如果方法参数名称与查询参数名称完全一致,Spring Boot 能够自动绑定参数。
@RestController
@RequestMapping("/api")
public class YourController {
@GetMapping("/getData")
public String getData(String param1, Integer param2) {
// 处理接收到的参数
return "Received param1: " + param1 + ", param2: " + param2;
}
}
例如,前端可以通过以下URL传递参数:
/api/getData?param1=value1¶m2=123
在这种情况下,param1
和 param2
会自动匹配到方法中的 param1
和 param2
参数,无需使用 @RequestParam
注解。
什么时候使用 @RequestParam
?
- 参数名称不匹配:当你需要将查询参数映射到与其名称不匹配的变量时。
- 需要默认值:当参数可能是可选的,并且你希望为未提供的参数指定一个默认值时。
- 需要参数校验:当你需要使用校验注解(如
@Valid
)时。
@GetMapping("/getData")
public String getData(@RequestParam(name = "param1", required = false, defaultValue = "defaultVal") String customParamName) {
return "Received param1: " + customParamName;
}
1.2. 使用 @RequestParam
接收多个参数
如果有多个参数,可以将参数封装到 Map
中:
@GetMapping("/getData")
public String getData(@RequestParam Map<String, String> params) {
// 处理接收到的所有参数
return "Received parameters: " + params.toString();
}
这种方式可以动态获取传递的所有查询参数。
1.3. 使用 @ModelAttribute
当前端传递的数据较多且字段较复杂时,可以使用 @ModelAttribute
将查询参数映射到一个对象中。
public class QueryParams {
private String param1;
private Integer param2;
// Getters and Setters
}
@RestController
@RequestMapping("/api")
public class YourController {
@GetMapping("/getData")
public String getData(@ModelAttribute QueryParams queryParams) {
// 处理接收到的参数
return "Received param1: " + queryParams.getParam1() + ", param2: " + queryParams.getParam2();
}
}
前端仍然可以使用相同的查询字符串:
/api/getData?param1=value1¶m2=123
在Spring Boot中,@ModelAttribute
注解并不是必须要标注的。当使用一个对象作为控制器方法的参数,并且请求中的参数名称与对象的属性名称匹配时,Spring Boot 会自动将请求参数绑定到该对象的属性上,即使不显式地标注 @ModelAttribute
。
什么时候不需要使用 @ModelAttribute
如果你有一个简单的对象,并且请求中的参数名称与对象的属性名称一一对应,那么可以省略 @ModelAttribute
注解,Spring Boot 会自动进行绑定
1.4 总结
- 如果是简单的几个参数,推荐使用
@RequestParam
直接接收。 - 如果参数较多,可以使用
@ModelAttribute
将参数封装为对象接收。
2.通过路径参数
在Spring Boot 中,前后端可以通过路径参数传递数据。路径参数(Path Variables)是 URL 中的一部分,通常用于标识资源。Spring Boot 使用 @PathVariable
注解来接收路径参数。
2.1 使用 @PathVariable
接收路径参数
你可以在控制器方法中通过 @PathVariable
注解来接收路径参数,并将其绑定到方法的参数中。
示例
假设你有一个 RESTful API 需要根据用户 ID 获取用户信息,URL 结构如下
/api/user/{id}
可以在控制器中定义如下方法:
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") Long userId) {
// 根据 userId 获取用户信息
return "User ID: " + userId;
}
}
在这个例子中,{id}
是路径参数,@PathVariable("id")
用来接收这个参数并将其绑定到 userId
变量。
/api/user/123
Spring Boot 会将 123
作为路径参数,并传递给 userId
。
2.2 默认路径参数名称匹配
如果路径参数名称与方法参数名称一致,可以省略 @PathVariable
注解中的参数名:
@GetMapping("/user/{id}")
public String getUserById(@PathVariable Long id) {
return "User ID: " + id;
}
2.3 多个路径参数
如果你有多个路径参数,可以这样定义:
@GetMapping("/user/{userId}/order/{orderId}")
public String getUserOrder(@PathVariable Long userId, @PathVariable Long orderId) {
return "User ID: " + userId + ", Order ID: " + orderId;
}
前端请求的 URL 可以是:
/api/user/123/order/456
Spring Boot 会将 123
绑定到 userId
,将 456
绑定到 orderId
。
2.3 总结
- 路径参数:用于标识特定资源,通常出现在 URL 中的
{}
中。 @PathVariable
注解:用于接收路径参数,支持默认名称匹配,也可以显式指定参数名。- 多个路径参数:可以在一个请求中接收多个路径参数,Spring Boot 会按顺序绑定。
路径参数在 RESTful API 中非常常见,适用于表示资源的层次结构或唯一标识符。
在Spring Boot 中,@PathVariable
注解是必须的,不能省略。路径参数是通过 @PathVariable
明确指定的,没有这个注解,Spring Boot 无法将 URL 中的路径变量自动绑定到方法参数上。