在Compojure / Clout中匹配路由

3
我正在尝试匹配以下形式的路由:{{mongoID}}.{{width}}x{{height}}.{{extension}}。例如,/5591499e2dbc18bd0f000050.240x240.jpeg是一个有效的路由。
我想这样解构它:
{:id        5591499e2dbc18bd0f000050
 :width     240
 :height    240
 :extension jpeg }
< p > < code >Compojure 支持正则表达式,似乎也支持点号 https://github.com/weavejester/compojure/issues/42

我可以为每个字段设置不同的正则表达式,但我不确定如何将其放入路由路径中(我正在尝试使用数组语法):https://github.com/weavejester/compojure/wiki/Routes-In-Detail#matching-the-uri

假设我有以下代码:

(GET ["/my-route/:mongoID.:widthx:height.:extension" :mongoID ...
                                                     :width ...
                                                     :height  ...
                                                     :extension ...])

显然,字符串"/my-route/:mongoID.:widthx:height.:extension"是不工作的(可能只是因为" x "丢失了,也可能有其他原因)。
我该如何修改我的路由以匹配我的参数?
注意:如果有用的话,我还在使用 Prismatic/Schema。
1个回答

4

Compojure使用clout进行路由匹配。这就是它如何允许您为每个参数指定正则表达式的方式。以下内容在clout中起作用:

user=> (require '[clout.core :as clout])
user=> (require '[ring.mock.request :refer [request]])
user=> (clout/route-matches (clout/route-compile "/my-route/:mongoID.:width{\\d+}x:height{\\d+}.:extension") (request :get "/my-route/5591499e2dbc18bd0f000050.240x240.jpeg"))
{:extension "jpeg", :height "240", :width "240", :mongoID "5591499e2dbc18bd0f000050"}

以下内容应该适用于compojure:
因此,以下内容在compojure中应该可以正常工作:
(GET "/my-route/:mongoID.:width{\\d+}x:height{\\d+}.:extension" 
     [mongoID width height extension]
     (do-something-with mongoID width heigth extension)

嗯...我更喜欢数组语法,但那也可以。谢谢! - nha
1
是的,数组语法更好。这可能有用:["/my-route/:mongoID.:width:x:height.:extension" :x #"x" :width #"\d+" :height #"\d+" :mongoID #"[^\\.]+"]。它稍微有点麻烦:我们需要将“x”作为一个单独的参数捕获(在解构时可以忽略),并且需要为mongoID添加一个正则表达式(而不是使用默认值 [^\ /,;?] +)。因此,它会在点处停止。 - nberger
那也是个不错的选择,非常感谢。我不能再给你点赞了,但我会的 :) - nha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接