当前位置 博文首页 > blackball1998的博客:获取前端参数
当前端发送一个请求时,如何使用Spring MVC获取请求中携带的参数呢?在请求中可以有很多种携带参数的方式,获取的方式也不一样,本文介绍如何获取url上的参数,路径变量上的参数,以及请求体中的参数
需要获取url上的参数,只需要在请求处理方法中,添加需要获取的参数,参数的名字就是请求中携带的参数名字,参数的类型可以对应请求中携带的参数类型,然后在参数前添加@RequestParam
注解,就可以获取url上的参数了
@RestController
public class MyController {
@GetMapping(path = "/user")
public Map<String, Object> queryUser(@RequestParam String name, @RequestParam int age) {
HashMap<String, Object> result = new HashMap<>();
result.put("name", name);
result.put("age", age);
return result;
}
}
示例中将请求携带的参数获取,然后再添加到返回的数据中
测试结果如下
正常获取了前端在url上的参数并返回
如果我们使用@RequestParam
注解绑定了一个参数,但是请求却没有携带这个参数,这时候请求会得到错误信息,后台也会警告没有这个参数。不过有时我们需要绑定一个可有可无的参数,这时候我们可以使用@RequestParam
注解的required属性
required属性默认值时true,只要我们设置为false,当请求没有携带这个参数时,Spring MVC就会将这个值置为null
@RestController
public class MyController {
@GetMapping(path = "/user")
public Map<String, Object> queryUser(@RequestParam(required = false) String name, @RequestParam int age) {
HashMap<String, Object> result = new HashMap<>();
result.put("name",name);
result.put("age", age);
return result;
}
}
需要注意的是,由于没有携带的参数会被置为null,而基本数据类型(例如int类型)不能是null值,如果这么做将会报错
如果我们在方法中的参数名,跟实际请求中携带的参数名不一致时,可以使用@RequestParam
注解的name属性或者value属性,来绑定请求中携带的参数名
@RestController
public class MyController {
@GetMapping(path = "/user")
public Map<String, Object> queryUser(@RequestParam(name = "username") String name, @RequestParam int age) {
HashMap<String, Object> result = new HashMap<>();
result.put("name",name);
result.put("age", age);
return result;
}
}
这时候如果请求中的参数名是name就获取不到了,必须使用绑定的username这个参数名
如果我们需要给参数一个默认值,当参数没有在请求中携带时就使用这个默认值,可以使用@RequestParam
注解的defaultValue属性
@RestController
public class MyController {
@GetMapping(path = "/user")
public Map<String, Object> queryUser(@RequestParam String name, @RequestParam(defaultValue = "18") int age) {
HashMap<String, Object> result = new HashMap<>();
result.put("name",name);
result.put("age", age);
return result;
}
}
这样示例请求中的age参数没有携带,也会使用默认值
如果使用了defaultValue属性,那么required属性只能是false,这个属性也适用于可以不需要基础类型的参数的时候,为这个参数赋一个默认值即可
如果我们使用RESTful风格的api,我们会将参数写在路径中,而不是用?
和&
传递参数,Spring MVC也为我们提供了一个注解@PathVariable
用于获取路径变量
@PathVariable
注解的使用方式跟@RequestParam
注解一样,也是添加在请求处理方法的参数上即可,然后在@RequestMapping
注解绑定的路径中,使用一对大括号{}
来匹配参数的名字
@RestController
public class MyController {
@RequestMapping("/user/{name}/{age}")
public Map<String, Object> queryUser(@PathVariable String name, @PathVariable int age) {
HashMap<String, Object> result = new HashMap<>();
result.put("name", name);
result.put("age", age);
return result;
}
}
这样我们在请求路径中的第二个值就代表name参数,第三个值就代表age参数
当请求方法中的参数和路径变量中的参数名不一致时,可以使用@PathVariable
注解中的name属性或者value属性来绑定路径变量上的参数名
当参数可以不存在时,可以设置@PathVariable
注解中的required属性为false
当我们使用POST类型的请求时,一般不会将参数在url中携带,而是在请求体中携带,这时候可以使用@RequestBody
这个注解来获取请求体中的参数
@RestController
public class MyController {
@PostMapping("/user")
public Map<String, Object> queryUser(@RequestBody String content) {
HashMap<String, Object> result = new HashMap<>();
result.put("content", content);
return result;
}
}
注意**@RequestBody
注解只能使用一个,并且请求头中的Content-Type需要设置为application/json**
在请求体中携带参数的方法,只能使用POST请求,GET请求没有请求体