1.概述

春天5带来了一个新的pathpatternparser.用于解析URI模板模式这是先前使用的替代方案反对者

反对者是蚂蚁式路径模式匹配的实现。pathpatternparser.将路径分解为链接列表途径。这一链条途径是由pathpattern.用于快速匹配模式的课程。

与之pathpatternparser.,还介绍了对新的URI变量语法的支持。

在本文中,我们将通过Spring 5.0 WebFlux中引入的新/更新的URL模式匹配器此外,自从旧版本的春天以来已经存在。

2. Spring 5.0中的新URL模式匹配器

Spring 5.0释放添加了一个非常易于使用的URI变量语法:{* foo},以捕获模式结束时的任意数量的路径段。

2.1。URI变量语法{* foo}使用处理程序方法

让我们看一下URI变量模式的示例{* foo}另一个例子使用@getMappping.和处理程序方法。无论我们在路径中给予什么“/ spring5”将存储在路径变量“ID”中:

@getmapping(“/ spring5 / {* id}”)公共字符串UrivariableHandler(@pathVariable字符串ID){返回ID;}
@test公共void whetMultIpreferUriveRariaNeDATRN_ThengotPathVariable(){client.get()。uri(“/ spring5 / bael金宝搏188体育dung / tutorial”).exchange().expectstatus().is2xxsuccessful().expectbody().equals().equals(“/ baeldung / tutorial”);client.get().uri(“/ spring5 金宝搏188体育/ baeldung”).exchange().expectstatus().is2xxsuccessful().expectbody().equals().equals(“/ baeldung”);}

2.2。URI变量语法{* foo}使用RouterFunction.

让我们看看新的URI变量路径模式的示例RouterFunction.

私有路由 routingFunction(){返回路由(get(“/ test / {* id}”),serverRequest  - > OK()。正文(fromValue(serverRequest.pathVariable(“ID”)))));}

在这种情况下,我们在“/ test”之后写的任何路径将在路径变量“ID”中捕获。所以它可能是:

@Test公共void whetMultiprefariveAliasePattern_thengotPathVariable()抛出异常{client.get().uri(“/ test / ab / cd”).exchange().expectytatus().isok().expectbody(string.class).isequalto(“/A B C D”);}

2.3。使用URI变量语法{* foo}访问资源

如果我们要访问资源,那么我们需要在前面的示例中写入时编写类似的路径模式。

所以让我们说我们的模式是:“/ files / {* filepaths}”。在这种情况下,如果路径是/files/hello.txt,路径变量的值“菲力群”将是“/hello.txt”,而如果路径是/files/test/test.txt,的价值“菲力群”=“/test/test.txt”。

我们的路由功能用于访问文件资源/文件/目录:

私有路由函数 routingFunction(){return routerfunctions.resources(“/ files / {* filepaths}”,新的classPathResource(“文件/”)));}

让我们假设我们的文本文件hello.txt.test.txt.包含“你好”“测试”分别。这可以用junit测试案例进行说明:

@Test公共void whetMultiprefariarePattern_thengotPathVariable()抛出异常{client.get().uri(“/ files / test / test.txt”).exchange().expectstatus().isok().expectbody(string.class).isequalto(“测试”);client.get().uri(“/ files / hello.txt”).exchange().expectstatus().isok().expectbody(string.class).isequalto(“Hello”);}

3.以前版本的现有URL模式

现在让我们偷看旧版本的春天支持的所有其他URL模式匹配器。所有这些模式都与两者一起使用RouterFunction.和处理程序方法@getMappping.

3.1。'?'恰好匹配一个角色

如果我们将路径模式指定为:“/ t?英石“,这将匹配以下方式:“/测试”“/ tast”,但不是“/ tst”“/ teest”。

使用示例代码RouterFunction.及其JUnit测试案例:

私有路由函数 routingFunction(){返回路由(get(“/ t?st”),serverRequest  - > OK()。身体(FromValue(“路径/ T?ST访问”)));@test public vod whergetpathwithsinglecharwildcard_thengotpathpattern()抛出异常{client.get().uri(“/ test”).exchange().expectstatus().expectstatus().isok().expectbody(string.class).isequalto(“路径/ t?ST被访问“);}

3.2。'*'匹配路径段内的0个或更多字符

如果我们将路径模式指定为:“/金宝搏188体育 baeldung / * id”,这将匹配路径模式喜欢:“/ b金宝搏188体育aeldung / id”,“/ baeldung / tutorialid”,“/金宝搏188体育 baeldung / starid”等:

私有路由函数 routingFunction(){returnRoute(get(“/ baeldung / * id”),金宝搏188体育serverRequest  - > OK()。身体(从Value(“/ Baeldung / * ID路径访问”))));@test公共vod whergetmultiplilecharwildcard_thengotpathpattern()抛出异常{client.get().uri(“/ baeldung / tutorialid”金宝搏188体育).exchange().expectytatus().isok().expectbody(string.class).isequalto(“/金宝搏188体育访问Baeldung / * ID路径)“);}

3.3。'**'匹配0或更多路径段,直到路径的结尾

在这种情况下,模式匹配不限于单个路径段。如果我们指定图案“/资源/**”,它会将所有路径与任意数量的路径段相匹配“/资源/”:

私有路由函数 routingFunction(){return routerfunctions.resources(“/ resources / **”,new classpathresource(“资源/”)));@Test公共void whenaccess_thengot()抛出异常{client.get().uri(“/ resource / test / test.txt”).exchange().expectytatus().isok().expectbody(string.class)。isequalto(“文件test.txt的内容”);}

3.4。'{金宝搏188体育baeldung:[a-z] +}'路径变量中的正则表达式

我们还可以为PATH变量的值指定REGEX。所以,如果我们的模式就像“/ 金宝搏188体育{baeldung:[a-z] +}”,路径变量的值“金宝搏188体育baeldung”将是与给出Regex匹配的任何路径段:

private RouterFunction routingFunction() { return route(GET("/{baeldung:[a-z]+}"), serverRequest -> ok() .body(fromValue("/{baeldung:[a-z]+} was accessed and " + "baeldung=" + serverRequest.pathVariable("baeldung")))); } @Test public void whenGetRegexInPathVarible_thenGotPathVariable() throws Exception { client.get() .uri("/abcd") .exchange() .expectStatus() .isOk() .expectBody(String.class) .isEqualTo("/{baeldung:[a-z]+} was accessed and " + "baeldung=abcd"); }

3.5。'/ {var1} _ {var2}'同一路径段的多条路径变量

Spring 5确保仅在分隔符分隔时才能在单个路径段中允许在单个路径段中允许多个路径变量。然后只能弹簧区分两个不同的路径变量:

私有路由函数 routingFunction(){返回路由(get(“/ {var1} _ {var2}”),serverRequest  - > OK().body(fromValue(serverrequest.pathvariable(“var1”)+“,”+serverRequest.pathVariable(“var2”))))))))));@Test公共void whengetmultiplepathvaribleSamesmment_thengotpathvariables()抛出异常{client.get().uri(“/ baeldung_tutorial”).exchan金宝搏188体育ge().expectstatus().isok().expectbody(string.class).isequalto(“Baeldung,教程“);}

4。结论

在本文中,我们在Spring 5中经历了新的URL匹配器,以及旧版本的春季版本的新网址。

一如既往地,可以找到我们讨论的所有示例的实现在github上

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
2注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!