Springboot处理请求参数的注解
前⾔
在springboot中有⼏种处理url请求参数的注解,它们分别是:
@PathVariable、@RequestHeader、@RequestParam、@MatrixVariable、@RequestBody,今天⼀起来学习下。
正⽂
1、@RequestParam
@RequestParam 可以⽤于将指定的请求参数赋值给⽅法中的形参。源码如下:
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
可以发现它有三个属性:
value:请求参数名(必须配置)
required:是否必需,默认为 true,即请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)
defaultValue:默认值,如果设置了该值,required 将⾃动设为 false,⽆论你是否配置了required,配置了什么值,都是 false(可选配置)
⽐如:
@RequestMapping("/testequestparam")
public String testequestParam(@RequestParam("name") String name){
return name+",你好啊!";
}
输出结果如下:
因为required参数默认是true,所以是必须的,如果请求地址后⾯不带参数则会报错:
如果将其值设为false,则请求成功,但是参数值为null:
@RequestMapping("/testequestparam1")
public String testequestParam1(@RequestParam(value="name",required = false) String name){
return name+",你好啊!";
}
@RequestParam还可以在参数为空的情况下,为我们设置⼀个参数的默认值:
@RequestMapping("/testequestparam2")
public String testequestParam2(@RequestParam(defaultValue = "defaultValue") String name){
return name+",你好啊!";
}
2、@PathVariable
@PathVariable是spring3.0的⼀个新功能,⽤来接收请求路径中占位符的值,源码如下:
public @interface PathVariable {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
}
⽰例:
@GetMapping("/car/{id}/user/{name}/band/{band}")
//localhost:8081/share/car/1/user/李四/band/⽐亚迪/
public String testPathVariable(@PathVariable("id") Integer id,
@PathVariable("name") String name,
@PathVariable("band")String band,
@PathVariable Map<String,String> pv){
param namereturn "返回的车是"+name+"的名下id为"+id+"的车,车⼦的品牌是"+band;
}
返回结果如下:
@PathVariable⽀持返回所有的路径变量:
@GetMapping("/map/car/{id}/user/{name}/band/{band}")
public Map<String,Object> testPathVariableMap(@PathVariable("id") Integer id,
@PathVariable("name") String name,
@PathVariable("band")String band,
@PathVariable Map<String,String> pv){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
map.put("band",band);
map.put("pv",pv);
return map;
}
除此之外@PathVariable还有和@RequestParam相同的属性required,⽤法⼀样,这⾥不再说明。
3、@RequestHeader
我们知道⼀个请求中会包含⼀些请求头等信息,如下:
@RequestHeader是获取请求头中的数据,通过指定参数 value 的值来获取请求头中指定的参数值。源码如下:
public @interface RequestHeader {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
通过源码可以发现其他参数⽤法和 @RequestParam完全⼀样。⽰例:
@GetMapping("/map1/car/{id}/user/{name}/band/{band}")
public Map<String,Object> testPathVariableMap1(@PathVariable("id") Integer id,
@PathVariable("name") String name,
@PathVariable("band")String band,
@PathVariable Map<String,String> pv,
@RequestHeader("User-Agent") String useragent,
@RequestHeader Map<String,String> header) {
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("name", name);
map.put("band", band);
map.put("pv", pv);
map.put("useragent",useragent);
map.put("header",header);
return map;
}
4、@MatrixVariable
@MatrixVariabl注解拓展了URL请求地址的功能。使⽤@Matrixvariable注解时多个变量可以使⽤;(分号)分隔,该注解允许开发者进⾏多条件组合査询。其源码如下:
public @interface MatrixVariable {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
String pathVar() default ValueConstants.DEFAULT_NONE;
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
可以发现其属性和RequestParam基本完全⼀样,但是多了⼀个pathVar属性,它表⽰矩阵变量所在的URI路径变量的名称,如有必要消除歧义(例如,在多个路径段中存在同名的矩阵变量)。⽰例:
@GetMapping("/phone/{path}")
public Map carsSell(@MatrixVariable("low") Integer low,
@MatrixVariable("band") List<String> brand,
@PathVariable("path") String path){
Map<String,Object> map = new HashMap<>();
map.put("low",low);
map.put("brand",brand);
map.put("path",path);
return map;
}
它和前⾯的注解直接使⽤是不⾏的,需要进⾏处理,因为SpringBoot默认是禁⽤了矩阵变量的功能,需要进⾏处理⼿动开启,对于路径的处理是通过UrlPathHelper进⾏解析,removesemicolonconten(移除分号内容)⽀持矩阵变量:这⾥写⼀个配置类:
@Configuration(proxyBeanMethods = false)
public class WebConfig implements WebMvcConfigurer {
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
hiddenHttpMethodFilter.setMethodParam("_m");
return hiddenHttpMethodFilter;
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer){
UrlPathHelper urlPathHelper = new UrlPathHelper();
//false表⽰不移除;后⾯的内容,矩阵变量功能就能⽣效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
5、@RequestBody
@RequestBody主要⽤来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);⽽最常⽤的使⽤请求体传参的⽆疑是POST请求了,所以使⽤@RequestBody接收数据时,⼀般都⽤POST⽅式进⾏提交。源码如下:
public @interface RequestBody {
boolean required() default true;
}
该注解只有⼀个required属性,默认是true。使⽤如下:
@PostMapping("/share/save")
public Map postMethod(@RequestBody String content){
Map<String,Object> map = new HashMap<>();
map.put("content",content);
return map;
}
总结
以上就是springboot中⼏个对于请求参数处理的注解,通过这些注解我们能够获取url中的参数然后进⾏对应的业务开发处理。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论