我正在尝试匹配以下格式的路线:{{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。
答案 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)