SpringBoot学习之-使用@RequestMapping更好的匹配请求

2,484 阅读3分钟

现在后台有一接口,功能为打招呼。编码如下:

    @RequestMapping("hello")
    public String hello(){
        return "hello";
    }

输入地址http://127.0.0.1:8080/hello就可以看到返回值了,但是需求说了打招呼并不止一种方式,hello可以,hi可以,how are you也可以。所以为了适应需求的变化,编码更改如下

@RequestMapping({"hello","hi","how are you"})
public String hello(){
    return "hello";
}

刚改好编码,需求又说了,有些人打招呼会带上人名,比如,hello zhangsan,hi lisi。那人名有无数种,这该怎么办呢?别急,spring也为 RequestMapping提供了模糊匹配功能。修改编码如下:

@RequestMapping("hello/*")
public String hello(){
    return "hello";
}

这样 http://127.0.0.1:8080/hello/zhangsan, http://127.0.0.1:8080/hello/lisi 就都可以请求到这个方法了。

现在不管谁和你打招呼,这个请求都可以被接收到了。但是,别人和你打招呼,你也得象征性的回复一下吧。总不能冷冰冰的光回复一个hello,好歹也来个hello老张,hello小李吧。

所以现在我们不光要模糊匹配这个人名,还得想办法获取到这个人名。修改编码如下:

@RequestMapping("hello/{name}")
public String hello(@PathVariable("name") String name){
    return "hello : "+name;
}

结合@PathVariable注解,我们在方法中就可以很方便的获取到和我们打招呼的人名了。

本以为可以开开心心的上线,结果到线上后发现有很多名字为数字的账户也恶意发了打招呼请求过来。那我们该如何屏蔽掉这些名字为数字的账户呢?

这个时候就可以用到正则表达式了,修改编码如下:

@RequestMapping("hello/{name:[a-z]+}")
public String hello(@PathVariable("name") String name){
    return "hello : "+name;
}

RequestMapping匹配url的使用到这儿就差不多了。下面在简单介绍下其余信息的匹配。

1.params

还是接上面的请求,如果现在有一个需求,需要统计所有打招呼人的性别。那这些打招呼的请求中,就必须带上性别sex字段。

@RequestMapping(value = "hello/{name:[a-z]+}",params = "sex")
public String hello(@PathVariable("name") String name){
    return "hello : "+name;
}

这样在请求中就必须带上sex字段了,不然我们是不会接的。 http://127.0.0.1:8080/hello/liuyu?sex=man

那既然带上sex字段了,有些特定时候我只想接受异性的打招呼该怎么办呢?

@RequestMapping(value = "hello/{name:[a-z]+}",params = "sex=female")
public String hello(@PathVariable("name") String name){
    return "hello : "+name;
}

或者不是男性的我都接。

@RequestMapping(value = "hello/{name:[a-z]+}",params = "sex!=male")
public String hello(@PathVariable("name") String name){
    return "hello : "+name;
}

对于有些不带性别,图谋不轨的,我们当然也要特殊照顾一下

@RequestMapping(value = "hello/{name:[a-z]+}",params = "!sex")
public String hello(@PathVariable("name") String name){
    return "滚! : "+name;
}

2.header用法和params类似,在这儿就不重复了

在RequestMapping注解里面还有两个参数consumes和produces,其实这两个参数含义也很简单.

consumes表示请求头中Content-Type字段包含在内,这个请求才会处理。 比如:

    @RequestMapping(value = "hello",consumes = "application/json")
    public String hello(){

这个方法,只有Content-Type=application/json,请求才会被处理,否则就是404.

而produces则表示请求头中Accept字段包含在内,才会处理。

    @RequestMapping(value = "hello",produces = "application/json")
    public String hello(){

这个方法需要Accept=application/json。

当然consumes和produces都可以表达反义。

    @RequestMapping(value = "hello",produces = "!application/json")
    public String hello(){

这样就代表Accept!=application/json


返回目录