在介绍Get请求相关注解之前,我认为正确的学习姿势,应该先瞅一眼Get请求的常见格式:
- url:port/path/param1/param2
例如 localhost:8080/get_method/mode_1/tony/89 - url:port/path?param1=xxx¶m2=xxx
例如 localhost:8080/get_method/mode_2/name=tony&age=89
对于这两种类型,服务端在接受get请求时,为了取得相应参数有相应两种不同注解:@PathVariable和@RequestParam,这两个注解有什么不同,我们可以从下面两个例子中看出一二:
@RestController
@RequestMapping("get_method")
public class GetController {
@GetMapping(path = "mode_1/{name}/{age}")
public Map getUrlPathParam(@PathVariable("name") String name, @PathVariable String age) {
return new HashMap(){{
put("name", name);
put("age", age);
}};
}
@GetMapping("mode_2")
public Map getQueryParam(@RequestParam(name = "name") String name, @RequestParam(defaultValue = "100") String age) {
return new HashMap(){{
put("name", name);
put("age", age);
}};
}
}
这时候当你在postman或是浏览器中调用:
localhost:8080/get_method/mode_1/tony/89或是localhost:8080/get_method/mode_2?name=tony&age=89,就可以得到对应的返回值
值得一提的是,在第一个方法的形参处由于url中参数名和我定义的方法参数名一致,所以@PathVariable的参数可以省略。需要注意的一点:在以上代码中所有跟协议相关的地方,比如在这里会成为url组成部分的"get_method","mode_1"等自定义参数,我在写的时候都是用的带下划线的小写字母,而不是驼峰形式,这里也是一种编码规范:跟协议有关的自定义变量尽量都用小写的形式(似乎是因为驼峰这种大小写都存在的形式,作为协议接口不友好,可能造成不能处理或是处理方式不一致的情况,所以尽量注意)
说到这里顺便介绍一下查看和理解注解支持的参数,当我们查看某个注解的定义时,以@RequestParam为例:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
@Target @Retention @Documented基本是废话,对理解具体注解没有帮助,我就不聊了,注解的成员方法所指代的就是这个注解可以做的些事情,而有的方法上方有@AliasFor则表示在调用该注解时,里面的参数名可以用这个别名当然也可以直接用方法名,就像上面代码示例一样@RequestParam(name = "age")就表示取请求参数中名称为age的参数。我举的这个例子有点意思,大家会发现如果按我的解释,@RequestParam(name = "age")和@RequestParam(value = "age")其实是一个意思,经验证,的确是一样的效果。
网友评论