【Spring Boot】Web开发 — URL映射

URL映射

上节介绍介绍了@Controller和@RestController等注解,那么Spring Boot是如何将HTTP请求映射到具体方法的呢?Spring Boot支持URL路径匹配、HTTP Method匹配、params和header匹配等URL映射。本节开始介绍Spring Boot的URL映射。

1.URL路径匹配

1.1 精确匹配

@RequestMapping的value属性用于匹配URL映射,value支持简单表达式:

java 复制代码
@RequestMapping("/getDataById/{id}")
    public String getDataById(@PathVariable("id") Long id) {
        return "getDataById:" + id;
    }

在上面的示例中,@PathVariable注解作用在方法参数中,用于表示参数的值来自URL路径。如果URL中的参数名称与方法中的参数名称一致,则可以简化为:

java 复制代码
@RequestMapping("/getDataById/{id}")
    public String getDataById(@PathVariable Long id) {
        return "getDataById:" + id;
    }

在上面的示例中,当在浏览器中访问/getDataById/1时,会自动映射到后台的getDataById方法,传入参数id的值为1。

1.2通配符匹配

@RequestMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求,示例代码如下:

java 复制代码
@RequestMapping("/getJson/*.json")
    public String getJson() {
        return "get json data";
    }

在上面的示例中,当在浏览器中请求/getJson/a.json或者/getJson/b.json时都会匹配到后台的Json方法。

@RequestMapping的通配符匹配非常简单实用,支持"*""?""**"等通配符。使用时需要了解通配符的匹配规则,否则容易出错。通配符匹配规则如下:

1)符号*匹配任意字符,符号**匹配任意路径,符号?匹配单个字符。

2)有通配符的优先级低于没有通配符的,比如/user/add.json比/user/*.json优先匹配。

3)有**通配符的优先级低于有*通配符的。

2.Method匹配

HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method和说明如表所示。

对于Web应用,GET和POST是经常使用的选项,而对于RESTful接口,则会使用PUT、DELETE等从语义上进一步区分操作。

@RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method。示例代码如下:

java 复制代码
@RequestMapping(value = "/getData",method = RequestMethod.GET)
    public String getData() {
        return "RequestMethod GET";
    }

@RequestMapping(value = "/getData",method = RequestMethod.POST)
    public String PostData() {
        return "RequestMethod POST";
    }

上面的示例实现了GET和POST两种方式。当使用GET方式请求/data/getData接口时,会返回"RequestMethod GET",使用POST方式请求/data/getData接口时,则返回"RequestMethod POST",说明@RequestMapping通过HTTP请求Method映射不同的后台方法。

3.consumes和produces匹配

@RequestMapping注解提供了consumes和produces参数用于验证HTTP请求的内容类型和返回类型。

consumes表示请求的HTTP头的Content-Type媒体类型与consumes的值匹配才可以调用方法。

produces表示HTTP请求中的Accept字段只有匹配成功才可以调用。

下面通过示例演示consumes和produces参数的用法:

java 复制代码
 //处理request Content-Type为"application/json类型的请求
    @RequestMapping(value="/Content", method = RequestMethod.POST, consumes = "application/json")
    public String Consumes (@RequestBody Map param) {
        return "Consumes POST Content-Type =application/json";
    }

上面的示例只允许Content-Type=application/json的HTTP请求映射此方法,其他类型则返回"Unsupported Media Type"的错误。

4.params和header匹配

@RequestMapping注解提供了header参数和params参数,通过header参数可以根据HTTP请求中的消息头内容映射URL请求,通过params参数可以匹配HTTP中的请求参数实现URL映射。

4.1 params

Spring Boot除了通过匹配URL和Method的方式实现映射HTTP请求之外,还可以通过匹配params的方式来实现。Spring Boot从请求参数或HTTP头中提取参数,通过判断参数,如params="action=save"确定是否通过。同时还可以设置请求参数包含某个参数、不包含某个参数或者参数等于某个值时通过,具体如下:

1)params={"username"},存在"username"参数时通过。

2)params={"!password"},不存在"password"参数时通过。

3)params={"age=20"},参数age等于20时通过。

通过@PostMapping设置的params参数来检查请求的params,实现HTTP的URL映射。示例代码如下:

java 复制代码
  @RequestMapping(value="/paramsTest", params = "action=save")
    public String paramsTest (@RequestBody Map param) {
        return "params test";
    }

在上面的示例中,当请求的参数action=save时,映射此方法。

4.2 header

header的使用和params类似,它检查HTTP的header头中是否有Host=localhost:8080的参数,如果有则匹配此方法。示例代码如下:

java 复制代码
@RequestMapping(value="/headerTest", headers = {"Host=localhost:8080"})
    public String headerTest () {
        return "header test";
    }
相关推荐
陆枫Larry3 分钟前
用 Git 别名(Alias)简化日常操作
前端
华科易迅5 分钟前
Spring AOP(注解前置+后置通知)
java·后端·spring
神奇小汤圆5 分钟前
一个 Spring Boot 项目,为什么要拆成 bootstrap、web、business、foundation、components、iot?
后端
阿泽·黑核6 分钟前
Easy Vibe Coding 学习心得(三):前端之美——从设计稿到精美界面
前端·vibe coding·easy vibe
Lear9 分钟前
【SpringBoot】 前后端参数命名踩坑记录:小驼峰变下划线导致接收不到参数
后端
无心水15 分钟前
【时间利器】4、JavaScript时间处理全解:Date/moment/dayjs/Temporal
开发语言·前端·javascript·状态模式·openclaw·date/moment·dayjs/temporal
踩着两条虫21 分钟前
AI 驱动的 Vue3 应用开发平台 深入探究(二十五):API与参考之Renderer API 参考
前端·vue.js·人工智能
踩着两条虫21 分钟前
AI 驱动的 Vue3 应用开发平台 深入探究(二十四):API与参考之Provider API 参考
前端·vue.js·ai编程
创梦流浪人27 分钟前
soli-admin一款开箱即用的RBAC后台项目
java·spring boot·vue3·springsecurity
恋猫de小郭27 分钟前
Android Studio Panda 2 ,支持 AI 用 Vibe Coding 创建项目
android·前端·flutter