mat*_*ver 3 regex api rest jax-rs
我正在为我的应用程序编写API,我对Jax-RS如何处理某些场景感到困惑
例如,我定义了两个路径:
@Path("user/{name : [a-zA-Z]+}")
Run Code Online (Sandbox Code Playgroud)
和
@Path("user/me")
Run Code Online (Sandbox Code Playgroud)
我指定的第一条路径明确包含第二条路径,因为正则表达式包括所有字母az.但是,该程序似乎没有问题.是因为它默认为最具体的路径(即/ me然后查找正则表达式)?
此外,如果我将两个正则表达式定义为具有一些重叠的路径会发生什么.是否有一个默认方法将被调用?
假设我想为三种不同的方法创建三个路径:
@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me")
Run Code Online (Sandbox Code Playgroud)
这是最佳做法/适当吗?它将如何知道调用哪种方法?
提前感谢您的任何澄清.
这是在"匹配资源方法请求" 中的规范
排序
E使用(1)每个成员中的文字字符数作为主键(降序),(2)捕获组的数量作为辅助键(降序),(3)捕获组的数量与非默认正则表达式(即不是'([^ /] +?)')作为三级键(降序),...
会发生什么是候选方法按指定的有序"密钥"排序.我用粗体突出显示它们.
第一个排序键是文字字符数.所以对于这三个
@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me")
Run Code Online (Sandbox Code Playgroud)
如果请求的URI是../user/me,则将始终选择最后一个,因为它具有最多的文字字符(7,/计数).其他人只有5人.
除了../users/me其他任何东西../users/..将取决于正则表达式.在您的情况下,一个只匹配数字,一个只匹配字母.这两个正则表达式无法重叠.所以它会相应匹配.
现在只是为了好玩,我们说我们有
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}")
@Path("user/me")
Run Code Online (Sandbox Code Playgroud)
如果你看一下前两个,我们现在有重叠的正则表达式.第一个匹配所有数字,第二个匹配.那么将使用哪一个?我们不能做任何假设.这是一个未指定的歧义程度,我看到了不同实现的不同行为.AFAIK,没有"最佳匹配"正则表达式的概念.它匹配或不匹配.
但是,如果我们想要{id : \\d+}始终首先检查,该怎么办?如果它匹配数字,则应选择该数字.我们可以根据规范进行破解.该规范谈到了基本上是{..}s的"捕获群体" .第二个排序键是捕获组的数量.我们破解它的方式是添加另一个"可选"组
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}{dummy: (/)?}")
Run Code Online (Sandbox Code Playgroud)
现在后者有更多的捕获组,所以它总是在排序中领先.它所做的只是允许一个可选的/,它不会真正影响API,但确保如果请求URI是所有数字,则始终选择此路径.
您可以在此答案中看到与某些测试用例的讨论
| 归档时间: |
|
| 查看次数: |
938 次 |
| 最近记录: |