如何在Compojure嵌套上下文中匹配没有尾部退格的URL?
问题我试图解决:
我想匹配以下路线:
/users/
/users/:user-id
/users/:user-id/resources/
第一个访问所有用户, 第二个用于单个用户实体, 最后是给定用户的所有资源。
使用以下defroutes
作品:
(defroutes
(GET "/users/" ...)
(GET "/users/:user-id" ...)
(GET "/users/:user-id/resources/" ...))
然而,随着我的API增长,我想使用上下文来澄清代码。
(defroutes
(context "/users"
(users-routes) ;; All users operations
(context "/:user-id" [user-id]
(user-routes user-id) ;; All per-user operations
(context "/resources" []
(resources-routes user-id))))) ;; All user - resources operations
这意味着user-routes
应该是这样的:
(defn user-routes [user-id]
(routes
(GET "" [uid] ...)))
在编译时给出了:
clojure.lang.ExceptionInfo: Parse error in route string
data: {:failure
{:index 0,
:reason
[{:tag :regexp, :expecting #"(https?:)?//"}
{:tag :string, :expecting ":"}
{:tag :string, :expecting "*"}
{:tag :regexp, :expecting #"\\."}
{:tag :regexp, :expecting #"(:[^\p{L}_*{}\\]|[^:*{}\\])+"}],
:line 1,
:column 1,
:text nil}}
clojure.lang.Compiler$CompilerException: clojure.lang.ExceptionInfo: Parse error in route string {:failure Parse error at line 1, column 1:
nil
^
Expected one of:
#"(https?:)?//"
":"
"*"
#"\\."
#"(:[^\p{L}_*{}\\]|[^:*{}\\])+"
}, compiling:(/Users/laurent/dev/suricate/web/src/web/routes/api.clj:134:5)
我认为这是由于解析网址的方式(使用Clout)因此我的问题,
在Compojure嵌套上下文中匹配没有尾随退格的URL的正确方法是什么?