在Compojure / Clout中匹配一条路线

时间:2015-07-03 15:05:56

标签: regex clojure

我正在尝试匹配以下格式的路线:{{mongoID}}.{{width}}x{{height}}.{{extension}} 例如,/5591499e2dbc18bd0f000050.240x240.jpeg是有效路线。

我希望能够像这样去解构它:

{:id        5591499e2dbc18bd0f000050
 :width     240
 :height    240
 :extension jpeg }

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 个答案:

答案 0 :(得分: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中起作用:

(GET "/my-route/:mongoID.:width{\\d+}x:height{\\d+}.:extension" 
     [mongoID width height extension]
     (do-something-with mongoID width heigth extension)