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

如今后台有一接口,功能为打招呼。编码以下:正则表达式

@RequestMapping("hello")
    public String hello(){
        return "hello";
    }
复制代码

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

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

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

@RequestMapping("hello/*")
public String hello(){
    return "hello";
}
复制代码

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

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

因此如今咱们不光要模糊匹配这我的名,还得想办法获取到这我的名。修改编码以下:post

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

结合@PathVariable注解,咱们在方法中就能够很方便的获取到和咱们打招呼的人名了。ui

本觉得能够开开心心的上线,结果到线上后发现有不少名字为数字的帐户也恶意发了打招呼请求过来。那咱们该如何屏蔽掉这些名字为数字的帐户呢?编码

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

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

RequestMapping匹配url的使用到这儿就差很少了。下面在简单介绍下其他信息的匹配。spa

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


返回目录