【发布时间】:2015-03-17 00:09:05
【问题描述】:
我有一个 ring+compojure 应用程序,我想根据路由是 Web 应用程序的一部分还是 api 的一部分(基于 json)应用不同的中间件。
我在堆栈溢出和其他论坛上找到了这个问题的一些答案,但这些答案似乎比我一直使用的解决方案复杂。我想知道我的做法是否有缺点,以及我的解决方案中可能缺少什么。我正在做的一个非常简化的版本是
(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))))
请注意,中间件比我在这里展示的要多。
我遇到的唯一“限制”是,由于 app-routes 有未找到的路由,它需要排在最后,否则会在找到 api 路由之前触发。
这似乎比我发现的其他一些解决方案更简单、更灵活,这些解决方案似乎要么使用额外的条件中间件,例如 ring.middleware.conditional,要么在我看来是更复杂的路由定义,其中存在额外的 defroutes 层和需要用任何“*”等定义 defroutes。
我怀疑我在这里遗漏了一些微妙的东西,虽然我的方法似乎有效,但在某些情况下会导致意外行为或结果等。
【问题讨论】:
-
这里的
routes是什么?——知道了:weavejester.github.io/compojure/compojure.core.html#var-routes