使用JAX-RS的不区分大小写的URL

Mat*_*all 8 java rest jax-rs jersey

有没有简单的方法在JAX-RS Web服务中提供不区分大小写的URL?这样做的目的是制作一个"宽容接受者"的网络服务.1

我想这可能是通过一个过滤器来做到这一点.to[Lower|Upper]Case()的所有传入的URL.不幸的是,这种实现需要程序员纪律/一致性,以确保应用程序中的所有硬编码URL字符串都是严格的[低].
另外,我还不知道JAX-RS类似于servlet过滤器.

如果重要,我使用Jersey作为我的JAX-RS实现.


1如同"在你所接受的内容中宽容,并严格遵守你所生产的"(不记得来源)

Tar*_*log 7

答案是否定的,因为根据RFC 3986的 URI基本上是区分大小写的:

6.2.2.1.案例规范化

对于所有URI,百分比编码三元组内的十六进制数字(例如,"%3a"对比"%3A")不区分大小写,因此应对其进行标准化以使用大写字母表示数字AF.

当URI使用通用语法的组件时,组件语法等价规则始终适用; 即,方案和主机不区分大小写,因此应该标准化为小写.例如,URI等同于http://www.example.com/.除非方案另有明确定义,否则假定其他通用语法组件区分大小写(参见第6.2.3节).

如果您仍希望使它们不区分大小写,则可以使用servlet过滤器并将其放在JAX-RS框架之前.您仍需要在应用程序中保持一致.

如果您考虑从Jersey切换到Apache Wink,您可以使用动态资源来确保所有URL都是较低/较高的.因此,将servlet过滤器与动态资源相结合可以成为这种情况的完整解决方案.


msc*_*yna 5

我想我找到了符合 JAX-RS 规范的简单解决方案。您可以在@Path注释正则表达式中使用如下所示:

@Path("/{message:[mM][eE][sS][aA][gG][eE]}")
Run Code Online (Sandbox Code Playgroud)

我已将它与 JBoss RESTeasy 实现一起使用。在那里查看更多。

  • 不区分大小写的标志适用于 Jersey 2.10 `@Path( "/{message : (?i)message}" )` (6认同)