Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Jax-RS重载方法/路径执行顺序_Regex_Api_Rest_Jax Rs - Fatal编程技术网

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

Regex Jax-RS重载方法/路径执行顺序,regex,api,rest,jax-rs,Regex,Api,Rest,Jax Rs,我正在为我的应用程序编写一个API,我对Jax-RS如何处理某些场景感到困惑 例如,我定义了两条路径: @Path("user/{name : [a-zA-Z]+}") 及 我指定的第一条路径显然包含第二条路径,因为正则表达式包含所有字母a-z。然而,该计划似乎没有这方面的问题。是否因为它默认为最特定的路径(即/me,然后查找正则表达式) 此外,如果我将两个正则表达式定义为具有某些重叠的路径,会发生什么。是否有将被调用的默认方法 假设我想为三种不同的方法创建三条路径: @Path{"user/

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

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

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

我指定的第一条路径显然包含第二条路径,因为正则表达式包含所有字母a-z。然而,该计划似乎没有这方面的问题。是否因为它默认为最特定的路径(即/me,然后查找正则表达式)

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

假设我想为三种不同的方法创建三条路径:

@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me")
这是最佳做法/适当做法吗?它如何知道调用哪个方法

提前感谢您的澄清。

这在“将请求匹配到资源方法”中

使用(1)每个成员中的文字字符数作为主键进行排序(降序),(2)捕获组数作为辅助键进行排序(降序),(3)使用非默认正则表达式的捕获组数(即非“([^/]+?)”作为第三键(降序)

结果是候选方法按指定的顺序“键”排序。我用粗体突出显示它们

第一个排序键是文字字符数。那么对于这三个

@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me") 
如果请求的URI是
。/user/me
,则将始终选择最后一个URI,因为它具有最多的文字字符(7,
/
计数)。其他的只有5个

除了
。/users/me
之外,任何其他
都将取决于正则表达式。在你的例子中,一个只匹配数字,一个只匹配字母。这两个正则表达式不可能重叠。因此,它将相应地匹配

现在只是为了好玩,假设我们有

@Path{"user/{name : .*}")
@Path("user/{id : \\d+}")
@Path("user/me")
如果你看前两个,我们现在有重叠的正则表达式。第一个将匹配所有数字,第二个也一样。那么将使用哪一个呢?我们不能做任何假设。这是一个未指定的模糊级别,我在不同的实现中看到了不同的行为。顺便说一句,没有“最佳匹配”正则表达式的概念。要么匹配,要么不匹配

但是如果我们希望总是首先检查
{id:\\d+}
,该怎么办呢。如果它与数字匹配,则应选择该选项。我们可以根据规范来破解它。该规范讨论了“捕获组”,基本上是
{..}
s。第二个排序键是捕获组的数量。我们破解它的方法是添加另一个“可选”组

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


您可以看到一些测试用例的讨论

答案很好!谢谢你,我正试图找到规格,但运气不好。
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}")
@Path("user/me")
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}{dummy: (/)?}")