Java 后端接收 Request 请求参数的 7 种方式
1. 直接在 Controller 方法参数上配置参数名
@RequestMapping("/method01")
public String method01(String name, Integer age, Double mon) {
User user = new User();
user.setName(name);
user.setAge(age);
user.setMoney(mon);
return JSON.toJSONString(user);
}
这种格式接收的是 method01?name=zhangsan&age=15&mon=20.0 格式的传参, 并且要求参数名与 url 地址中携带的参数名完全一致;
这种形式传参与请求方式无关, get post .put 等皆可;
2.@RequestParam 接收 url 地址中的参数
@RequestMapping(value = "/method02")
public String method02(@RequestParam("name") String name,
@RequestParam("age") Integer age,
@RequestParam(value = "money", required = false) Double mon) {
User user = new User();
user.setName(name);
user.setAge(age);
user.setMoney(mon);
return JSON.toJSONString(user);
}
这种方式原理上与第一种一致, 都是接收请求 url 地址种的参数, 所以与请求方式无关;
这种方式注解种的 value 值会去映射请求 url 中的同名参数取参然后赋值给加注解的形参, 所以注解中的参数名必须与 url 中一致, 而方法形参名可以根据自身需求灵活变更;
注意加此注解的 required 属性 默认为 true, 也就是接收请求时会根据 value 去 url 寻找同名参数, 如果没找到会报错;
所以如果有某一参数可能不传的情况, 需要将 required 属性设为 false
3.@RequestBody 接收 body 中 JSON 字符串参数
@RequestMapping(value = "/method03")
public String method03(@RequestBody User user) {
return JSON.toJSONString(user);
}
上面两种方式都是通过从请求头 (url) 中传参的方式实现获取参数,@RequestBody 则是接收请求体中的 JSON 字符串参数直接映射实体对象, 所以 body 类型必须是 JSON 字符串;
注意实体类中的属性名称必须与 JOSN 串中的参数 key 名称完全一致, 不同命参数无法正确接收;
使用此种方式推荐使用 Post 请求携带 body 参数, get 请求虽然也可以携带 body 参数并请求成功但并不推荐这样操作,
通常 get 请求通过 url 携带参数可以根据 url 作为 key 缓存资源, 常用的静态资源服务器都是这种原理, 如果参数在 body 中这种方式就失效了
4. 直接通过实体接收参数
@RequestMapping(value = "/method04")
public String method04(User user) {
return JSON.toJSONString(user);
}
这种方式要求请求中的参数名与实体中的属性名一致即可自动映射到实体属性中;
支持 url 拼接的多个 params 传参
支持 post 请求 的 form 类型传参 (form-data,x-www-form-urlencoded), 不支持 JSON 传参
5.@ModelAttribute 接收实体参数
@RequestMapping("/method05")
public String method05(@ModelAttribute("user") User user) {
return JSON.toJSONString(user);
}
@ModelAttribute 注解主要作用是自动将数据暴露为模型数据用于视图页面展示时使用, 比如此处注解 value 为 user, 前端视图就可以通过 ${user.name} 来获取绑定的命令对象的属性
此用法与方法 4 完全一致, 支持 url 拼接的多个 params 传参
可以用于接收 url 或者 from 表单中的数据映射实体;
支持 post 请求 的 form 类型传参 (form-data,x-www-form-urlencoded), 不支持 JSON 传参
6.HttpServletRequest request 接收参数
@RequestMapping("/method06")
public String method06(HttpServletRequest request) {
User user = new User();
user.setName(request.getParameter("name"));
user.setAge(Integer.valueOf(request.getParameter("age")));
user.setMoney(Double.parseDouble(request.getParameter("money")));
return JSON.toJSONString(user);
}
传统的接收参数方式, 可以接收 url params 传参, 支持 post from 类型传参, 不支持 JSON 传参
注意如果请求中未传递指定名称的参数, 取参时会报错
7.@PathVariable RestFul 风格传参
@RequestMapping(value = {"/method07/{name}/{age}/{money}","/method07/{name}/{money}"})
public String method07(@PathVariable("name") String name,
@PathVariable(value = "age", required = false) Integer age,
@PathVariable("money") Double money) {
User user = new User();
user.setName(name);
user.setMoney(money);
user.setAge(age);
return JSON.toJSONString(user);
}
通过 @PathVariable 实现 restFul 风格传参, 直接将参数拼接到 url 地址中, 支持 get,post,put delete 等多种请求
required 属性默认为 true , 不传递参数会报错;
如果出现某个参数未传递的情况可以通过设置 required 属性为 false 并设置多个 value 字符串的形式实现
User 实体类
@Data
@ToString
public class User {
private String name;
private Integer age;
private Double money;
}
总结:
以上就是七种常见的请求方式, 不足之处请多指正啦
在Spring MVC中,你可以使用多种方式接收前端参数。以下是几种常用的方法和相应的示例:
- 使用@RequestParam注解接收参数:
@GetMapping("/hello")
public String hello(@RequestParam("name") String name) { return "Hello, " + name + "!";
}
前端传递参数的例子:(http://localhost:8080/hello?name=John)
2. 使用@PathVariable注解接收路径参数:
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {
// 根据id查询用户
}
前端传递参数的例子:(http://localhost:8080/users/1)
3. 使用@RequestBody注解接收JSON格式的请求体参数:
@PostMapping("/users") public User createUser(@RequestBody User user) {
// 创建用户
}
前端传递参数的例子(JSON格式):
{ "name": "John",
"age": 25,
"email": "[email protected]"
}
-
使用@RequestParam注解接收多个参数:
@PostMapping("/login")
public String login( @RequestParam("username") String username, @RequestParam("password") String password) {
// 验证用户名和密码
}
前端传递参数的例子:(http://localhost:8080/login?username=admin&password=123456)
这些示例展示了常见的接收前端参数的方式,包括查询参数、路径参数和请求体参数。根据你的具体需求和前端传递参数的方式,你可以选择适合的方式来接收参数。