Controller接口地址還能這樣玩?
環(huán)境:SpringBoot3.2.5
1. 正則表達式的路徑
Controller映射地址允許通過正則表達式URL匹配,可以捕獲URL中的特定部分,作為參數(shù)傳遞給Controller方法,從而處理更廣泛的請求類型。這種方式提高了路由的靈活性和復用性,使得Web應用能夠更精確地響應客戶端的請求,每部分的語法格式為:
{varName:regex}
通過上面的正則表達式聲明 URI 變量。varName方法參數(shù)中的變量名,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) ;
}
其中參數(shù):name:[a-z-]+匹配由任意數(shù)量的小寫字母和/或破折號"-"組成的字符串,至少需要有一個這樣的字符。
version:\\d\\.\\d\\.\\d匹配三個數(shù)字,其中每兩個數(shù)字之間用一個點分隔。
ext:\\.[a-z]+匹配一個點字符后面跟著至少一個或多個小寫字母的字符串。
請求示例:
圖片
2. URI路徑占位符
URI 路徑模式還可以嵌入 ${...} 占位符,這些占位符在啟動時通過使用 PropertySourcesPlaceholderConfigurer 針對本地、系統(tǒng)、環(huán)境和其他屬性源進行解析。例如,可以使用它根據(jù)某些外部配置對基本 URL 進行參數(shù)化,如下示例:
@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. 類級別的路徑參數(shù)
通常通過/{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}的路徑參數(shù),在方法參數(shù)中可以直接接收。
4. 后綴匹配
從5.3版本開始,Spring MVC默認情況下不再對以".*"結尾的路徑模式進行匹配,因此,如果將控制器映射到/person路徑,它也將隱式地映射到/person.*路徑。因此,路徑擴展不再用于解釋響應請求的內(nèi)容類型(例如,/person.pdf、/person.xml等)。
說明:我們可以通過請求的后綴來確定給客戶端響應什么格式的內(nèi)容。而此功能從5.2.4版本開始已經(jīng)被聲明為過時了,從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) ;
}
}
以上是不同版本開啟根據(jù)路徑后綴響應客戶端內(nèi)容類型的方式。接下來進行實例代碼演示如何使用
接口定義
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的格式轉換器。
圖片
你也可以自定義格式內(nèi)容,不過這需要你對HttpMessageConverter比較的了解。