2

我正在用 RESTeasy 编写一个 RESTful Web 服务。这是 JAX-RS 的实现。您可以使用单个 @Path 注释来注释类或方法。正则表达式用于获取路径参数。例如

@Path("/foo{varname:.*}/bar")

匹配所有以 "/foo" 开头、以 "/bar" 结尾以及介于两者之间的所有模式。介于两者之间的任何内容都分配给名为 varname 的参数。

一些框架(如 Django)有一个正则表达式和方法的列表,这些正则表达式和方法将按顺序尝试。例如 /john/q/smith、/john/{.*}/smith、/john/{.*}/{.*}。"/john/henry/smith" 匹配第二个和第三个,但第二个将被调度,因为它是找到的第一个匹配项。

这在 JAX-RS 中是否可行,或者类和方法没有固有的顺序?对于 /john/{.*}/{.*},您是否必须编写一个表示 /john/anything/anythingbutsmith 的正则表达式?每次更改其他文件时,您都必须更改它。

4

2 回答 2

2

有一个定义明确的算法,JAX-RS 规范的第 3.7.1 节描述了它。坦率地说,我觉得这个解释很不透明——所以阅读它,我无法回答你的问题。

但是,我刚刚找到了选择算法的CXF 概述,这似乎表明优先规则确实可以让你做你想做的事。

于 2009-12-02T14:07:33.700 回答
0

优先规则

JAX-RS规范为匹配 URI 表达式定义了严格的排序和优先规则,并且基于最具体的匹配获胜算法。提供JAX-RS者收集已部署的 URI 表达式集并根据以下逻辑对它们进行排序:

  1. 排序的主键是完整 URI 匹配模式中的文字字符数。排序是按降序排列的。在我们模棱两可的例子中,getCustomer() 的模式有 11 个文字字符:/customers/。getAddress() 方法的模式有 18 个文字字符:/customers/ 加上地址。因此,JAX-RS 提供者将尝试在 getCustomer() 之前匹配 getAddress() 的模式。

  2. 排序的次要关键字是嵌入在模式中的模板表达式的数量——即 {id} 或 {id : .+}。这种排序是按降序排列的。3.排序的第三键是非默认模板表达式的数量。默认模板表达式是一个没有定义正则表达式的模板,即 {id}。

于 2019-12-02T04:00:38.367 回答