【问题标题】:How to use site-defaults middleware for one set of routes and api-defaults for another set of routes?如何为一组路由使用 site-defaults 中间件,为另一组路由使用 api-defaults?
【发布时间】:2020-03-06 06:32:08
【问题描述】:

在我的 Compojure/Ring Web 应用程序的处理程序中,我需要使用 site-defaults 中间件提供一组路由,并使用 api-defaults 中间件提供另一组单独的路由。我该怎么做?

下面的代码仅使用site-defaults 中间件提供一组路由。我应该添加什么来使用 api-defaults 中间件为第二组路由 (api-routes) 提供服务?

(web-experiment.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.defaults :refer [wrap-defaults
                                              site-defaults
                                              api-defaults]]
            [web-experiment.views :refer :all]))

(defroutes app-routes
  (GET "/" [] (index-page))
  (GET "/about" [] (about-page))
  (route/not-found "Not Found"))

(defroutes api-routes
  (GET "/grapefruit" [:as {body :body}] (grapefruit-api body))
  (GET "/factory" [:as {body :body}] (factory-api body))
  (GET "/umbrella" [:as {body :body}] (umbrella-api body))
  (route/not-found "Not Found"))

(def app
  (wrap-defaults app-routes site-defaults))
;; TODO: Add api-routes. How to use api-defaults middleware to serve api-routes?

我读过这些:

【问题讨论】:

    标签: clojure compojure ring


    【解决方案1】:

    我不确定如何在 Compojure 中解决此问题,但您可能希望考虑使用 Pedestal。 This page 很好地介绍了路由匹配过程,该过程发生在任何拦截器被调用(Ring 中间件的 Pedestal 替代品)之前。

    所以你可以定义两组不同的中间件:

    (def user-intc-chain [inject-connection auth-required (body-params/body-params)] )
    (def api-intc-chain  [inject-connection auth-required api-params-intc] )
    

    然后定义如下路由:

    ["/echo"   :get (conj user-intc-chain echo-intc) ] ; a "user" route
    ["/alive?" :get (conj api-intc-chain alive-intc) ] ; an "api" route
    

    除了内置的 Pedestal 功能外,我还记录了许多帮助和便利功能:https://cloojure.github.io/doc/tupelo/tupelo.pedestal.html

    【讨论】:

      【解决方案2】:

      您可以将一些路由包装在一个包装器中,而将其他一些路由包装在另一个包装器中。你只需要稍微不同地组织你的路线。

      前段时间我写了一个演示,你可以用环形路由做什么。你可以在https://github.com/ska2342/ring-routes-demo/找到它

      尤其是演示中从line 70 开始的部分,您应该会很感兴趣。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 2016-06-09
        • 2018-08-08
        • 2014-12-14
        • 2012-12-17
        • 1970-01-01
        • 2016-02-07
        相关资源
        最近更新 更多