REST中的子资源和路径变量冲突?

Eri*_*ric 4 rest jax-rs jersey

设计一个可能在路径分辨率上有歧义的REST API被认为是不好的做法吗?例如:

GET /animals/{id}   // Returns the animal with the given ID
GET /animals/dogs   // Returns all animals of type dog
Run Code Online (Sandbox Code Playgroud)

好吧,这是设计的,因为你实际上只是这样做GET /dogs,但希望它说明了我的意思.从路径分辨率的角度来看,似乎你不知道你是在寻找动物id="dogs"还是只是所有动物dogs

具体来说,我对泽西岛是否会解决这个问题感兴趣.如果你知道它id是一个整数怎么办?

Pau*_*tha 7

"具体来说,我对泽西岛是否会解决这个问题感兴趣"

不,这不是问题.如果查看JAX-RS规范§3.7.2,您将看到将请求与资源方法匹配的算法.

[ E是匹配方法的集合] ......

排序ê使用中的每个成员作为主键(降序),(捕获组作为次要键(降序),并捕获基团与非默认的正则表达式的数量的数量,即不是"的文字字符的数目( [^ /] +?)')作为三级键(降序)

所以基本上它说,数字或文字字符是其中的排序由主键(注意,这是短路;你赢一次,你赢了).因此,举例来说,如果一个请求到达/animals/cat,@Path("/animals/dogs")显然不会是在集,所以我们并不需要担心它.但是如果请求是/animals/dogs,则两个方法都在集合中.然后按照文字字符数对该集合进行排序.由于@Path("/animals/dogs")有更多的字面字符@Path("/animals/"),前者胜出.捕获组{id}不计入文字字符.

"如果你知道id是一个整数怎么办?"

捕获组允许正则表达式.所以你可以使用@Path("/animals/{id: \\d+}").任何不是数字的东西都不会通过并导致404,除非它当然是/animals/dogs.