我有一个使用ring+compojure编写的应用程序,我希望能够根据路由属于Web应用程序还是基于JSON的API来应用不同的中间件。
我在Stack Overflow和其他论坛上找到了一些关于这个问题的答案,但这些答案似乎比我正在使用的解决方案更复杂。我想知道我所做的方式是否存在缺陷,以及我的解决方案可能存在的问题。我正在做的一个非常简化的版本是
(defroutes app-routes
(GET "/" [req] dump-req)
(route/not-found "Not Found"))
(defroutes api-routes
(GET "/api" [req] dump-req))
(def app
(routes (-> api-routes
(wrap-defaults api-defaults))
(-> app-routes
(wrap-defaults site-defaults))))
请注意,这里的中间件比我展示的要多。
我遇到的唯一“限制”是,由于应用路由有未找到的路由,它需要放在最后,否则会在查找API路由之前触发。
这似乎比我发现的一些其他解决方案更简单和灵活,其他解决方案似乎要使用额外的条件中间件(例如ring.middleware.conditional)或者更复杂的路由定义,其中有一个额外的defroutes层并且需要使用ANY“*”等定义defroutes。
我怀疑我在这里漏掉了一些微妙之处,虽然我的方法似乎有效,但在某些情况下它将导致意想不到的行为或结果等。
routes
是什么?明白了:http://weavejester.github.io/compojure/compojure.core.html#var-routes - Ahmed Fasih