regex - Jax-RS 重载方法/路径执行顺序

标签 regex api rest jax-rs

我正在为我的应用程序编写 API,但我对 Jax-RS 如何处理某些场景感到困惑

例如,我定义了两条路径:

@Path("user/{name : [a-zA-Z]+}")


@Path("user/me")

我明确指定的第一个路径包含第二个路径,因为正则表达式包含所有字母 a-z。但是,该程序似乎没有这个问题。是不是因为它默认为最具体的路径(即/me 然后查找正则表达式)?

此外,如果我将两个正则表达式定义为有一些重叠的路径会发生什么。是否有将调用的默认方法?

假设我想为三种不同的方法创建三个路径:
@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me")

这是最佳实践/合适吗?它如何知道调用哪个方法?

预先感谢您的任何澄清。

最佳答案

这是在 the spec在“将请求与资源方法匹配”中

Sort E using (1) the number of literal characters in each member as the primary key (descending order), (2) the number of capturing groups as a secondary key (descending order), (3) the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’) as the tertiary key (descending order), ...



会发生什么是候选方法按指定的有序“键”排序。我用粗体突出显示它们。

第一个排序键是文字字符数。所以对于这三个
@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me") 

如果请求的 URI 是 ../user/me ,将始终选择最后一个,因为它具有最多的文字字符(7,/ 计数)。其他人只有5个。

除了 ../users/me其他 ../users/..将取决于正则表达式。在您的情况下,一个只匹配数字,一个只匹配字母。这两个正则表达式无法重叠。所以它会相应地匹配。

现在只是为了好玩,假设我们有
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}")
@Path("user/me")

如果您查看前两个,我们现在有重叠的正则表达式。第一个将匹配所有数字,第二个也将匹配。那么会用到哪一个呢?我们不能做任何假设。这是一个未指定的歧义级别,我已经看到不同实现的不同行为。 AFAIK,没有“最佳匹配”正则表达式的概念。要么匹配要么不匹配。

但是如果我们想要 {id : \\d+} 怎么办?总是首先检查。如果它匹配数字,那么应该选择它。我们可以根据规范破解它。规范谈到“捕获组”,基本上是 {..} s。第二个排序键是捕获组的数量。我们可以破解它的方法是添加另一个“可选”组
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}{dummy: (/)?}")

现在后者有更多的捕获组,所以它总是在排序中领先。它所做的只是允许一个可选的 / ,这不会真正影响 API,但确保如果请求 URI 都是数字,则将始终选择此路径。

你可以看到一些测试用例的讨论 in this answer

关于regex - Jax-RS 重载方法/路径执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690946/

相关文章:

javascript - 如何使用 Youtube Javascript API 只播放声音?

json - 使用世界在线天气

python - Paypal API : Get balance of other users?

rest - OData substringof 或startswith 返回所有项目

java - 配置 OSGI Enroute REST 应用程序以允许异步请求

regex - sed:如何替换\0,而不是\\0

php - 正则表达式从 url 中过滤 int

json - 有没有更简单的方法来使用 net/http 实现 JSON REST 服务?

node.js - Mongodb反向匹配API端点路径

regex - 模板工具包在字符串中保留前 20 个字符