Controller接口地址还能这样玩?

开发 前端
Controller映射地址允许通过正则表达式URL匹配,可以捕获URL中的特定部分,作为参数传递给Controller方法,从而处理更广泛的请求类型。

环境:SpringBoot3.2.5

1. 正则表达式的路径

Controller映射地址允许通过正则表达式URL匹配,可以捕获URL中的特定部分,作为参数传递给Controller方法,从而处理更广泛的请求类型。这种方式提高了路由的灵活性和复用性,使得Web应用能够更精确地响应客户端的请求,每部分的语法格式为:

{varName:regex}

通过上面的正则表达式声明 URI 变量。varName方法参数中的变量名,regex为正则表达式。如下完整示例:

@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public Object p1(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
  return String.format("%s-%s%s", name, version, ext)  ;
}

其中参数:name:[a-z-]+匹配由任意数量的小写字母和/或破折号"-"组成的字符串,至少需要有一个这样的字符。
version:\\d\\.\\d\\.\\d匹配三个数字,其中每两个数字之间用一个点分隔。
ext:\\.[a-z]+匹配一个点字符后面跟着至少一个或多个小写字母的字符串。

请求示例:

图片图片

2. URI路径占位符

URI 路径模式还可以嵌入 ${...} 占位符,这些占位符在启动时通过使用 PropertySourcesPlaceholderConfigurer 针对本地、系统、环境和其他属性源进行解析。例如,可以使用它根据某些外部配置对基本 URL 进行参数化,如下示例:

@GetMapping("${pack.uri}")
public Object uri() {
  // TODO
  return "uri" ;
}

在配置文件中定义pack.uri

pack:
  uri: /xxxooo

请求示例

图片图片

组合使用

@GetMapping("/api${pack.uri}")
public Object uri()

甚至你还可以使用SpEL表达式

@GetMapping("/api${pack.uri}/#{1+2}")
public Object uri()

请求示例:

图片图片

只要是合法的符合路径格式的SpEL表达式都是支持的。

3. 类级别的路径参数

通常通过/{xx}定义的路径变量一般都是应用到具体的请求方法上,其实你还可以应用到类级别上,如下示例:

@RestController
@RequestMapping("/users/{type}")
public class PathController {
  private static final List<User> DATAS = ... ;
  @GetMapping("/single/{id}")
  public Object p1(@PathVariable Integer type, @PathVariable Long id) {
    return DATAS.stream().filter(u -> type == u.getType() && id == u.getId()).collect(Collectors.toList()) ;
  }
}

该示例在类上接收一个{type}的路径参数,在方法参数中可以直接接收。

4. 后缀匹配

从5.3版本开始,Spring MVC默认情况下不再对以".*"结尾的路径模式进行匹配,因此,如果将控制器映射到/person路径,它也将隐式地映射到/person.*路径。因此,路径扩展不再用于解释响应请求的内容类型(例如,/person.pdf、/person.xml等)。

说明:我们可以通过请求的后缀来确定给客户端响应什么格式的内容。而此功能从5.2.4版本开始已经被声明为过时了,从5.3开始默认不再进行模式的匹配。在6.0(具体哪个版本没有去查证)开始你此项配置直接从配置属性中删除,但是你可以通过配置类的方式进行配置开启此功能。接下来进行实例的讲解。

由于我使用的SpringBoot版本是3.2.5对应的Spring MVC是6.1.6所以配置文件中不能开启此项功能。

5.3.x版本通过配置开启

spring:
  mvc:
    contentnegotiation:
      favor-path-extension: true

6.x版本通过配置类开启

@Component
public static class PathWebMvcConfigurer implements WebMvcConfigurer {


  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    // 开启路径后缀功能
    configurer.favorPathExtension(true) ;
  }
}

以上是不同版本开启根据路径后缀响应客户端内容类型的方式。接下来进行实例代码演示如何使用

接口定义

private static final List<User> DATAS = ... ;
@GetMapping("/{id}/fmt.*")
public Object p1(@PathVariable Long id) {
  return DATAS.stream().filter(u -> id == u.getId()).collect(Collectors.toList()) ;
}

这里的路径通过.*模式进行匹配。接下来直接访问

图片图片

这里以json为后缀,相应结果将以json格式放回。如果你希望xml格式,那么你需要引入包

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

上面的包引入后,就不需要做任何配置,容器启动时会自动的注册关于XML的格式转换器。

图片图片

你也可以自定义格式内容,不过这需要你对HttpMessageConverter比较的了解。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2024-12-03 09:45:34

2020-11-16 13:38:31

PostMessage

2021-07-28 06:10:47

拖拽设计器 transmat

2021-09-05 07:55:37

前端Emoji 表情

2024-06-13 08:19:08

Controller接口参数

2018-12-12 11:30:54

JavaString字符串

2024-01-30 09:21:29

CSS文字效果文字装饰

2021-04-09 08:23:30

Css前端加载动画

2023-02-26 00:00:02

字符串分割String

2020-05-22 10:00:08

数据库数据库设计软件设计

2021-01-30 07:51:59

微信微信8.0腾讯

2023-01-30 08:46:20

GoGo1兼容性

2022-10-31 08:47:21

人脸识别按键键盘

2019-11-08 10:48:07

Windows操作系统微信Windows 10

2021-10-29 07:49:22

Spring事务管理

2016-09-23 15:36:53

Windows10开始菜单程序

2020-05-09 16:45:56

ping命令Linux

2012-07-13 11:32:16

网络出口

2020-09-14 11:26:54

BinlogCanal数据库

2024-03-25 08:03:32

技术面试ShowMeBug协同编程
点赞
收藏

51CTO技术栈公众号