我正在尝试使用JSX-RS实现一项服务,我有一种情况,在这种情况下,应该通过一种方法来满足不同版本号的多种类型的请求。
@Path("/url1/url2{version: [[/v][0-9][.][0-9]]*}")
这应该迎合 -
/url1/url2 /url1/url2/v1 /url1/url2/v1.2
其中版本分别为0,1和1.2。
我有正确的正则表达式,但代码似乎不接受它
((/v[0-9])(.[0-9])?)
?我在这里很困惑。
我需要在v之后和小数点(。)之后将其限制为仅一位数,并且我只需要一次出现/ v *。例如 -
/ur1/url2/v1v1
不允许
另外我想明智地知道,如果我有一个带小数点的网址,是否会花费更多时间来解析它。我必须对其进行网址编码吗?任何其他建议将不胜感激。
替代方法适用于每个版本,我有@path param的单独方法。这最终是最好的解决方案吗?
非常欢迎任何建议或想法!
答案 0 :(得分:1)
好的,这就是我这样做的方式:
首先,v
是可选的,因为您必须接受/url1/url2
之类的模式。所以,我会从:
(/v)?
?
表示零次或一次。
现在,如果你输入一个/v
,那么你必须有一个版本数字(即/v1
),但这只是你把/v
放在第一位,对吗? / p>
有点像:(/v\d)?
无需为数字\d
指定量词,因为默认值为1。由于?
量词,整个组可以出现零次或一次。
现在,如果您输入一个版本数字,那么您可以选择将第二个版本数字用点分隔(即/v1.1
)。但这仅在您首先使用版本号时才有效,并且此组是可选的。如果看起来它应该只显示一次,那么我们可以再次使用量词?
。
所以,有点像这样:
(/v\d(\.\d)?)?
请注意,我使用了\.
来表示我们希望这里有一个“点”。之所以这样,是因为.
是一个预定义的正则表达式字符类,它代表任何字符,因此您必须将其转义以表示您期望"."
。
因此,这适用于我提供的所有测试方案。