了解Ring和Appengine-magic(Clojure)上的处理程序

时间:2010-12-17 01:55:18

标签: http google-app-engine clojure httpwebrequest ring

我开始研究一些clojure网络应用程序,并决定使用Ring + Compojure的组合。 最近我决定用AppEngine-magic(https://github.com/gcv/appengine-magic)试用Google Appengine。然而,appengine-magic(通过它的启动函数)和ring的run-jetty函数只需要1个处理程序作为参数,我正在实现几个处理程序,并想知道如何部署它们。

提前致谢, 泽

2 个答案:

答案 0 :(得分:5)

总会有一个顶级处理程序 - 毕竟,即使在某个概念级别有多个处理程序,应用程序也需要决定以某种方式应用于给定请求的那个,所以例程选择成为顶级处理程序。因此,简短的回答是,您需要提供一个函数,该函数将查看请求并将其交给应用程序内的多个处理程序中的相应处理程序;该函数是赋予run-jetty(或等价物)的处理程序。

通常使用Ring + Compojure,您将拥有一些用于处理特定URI的基本(“内部”)处理程序和一些作为中间件实现的特殊用途处理程序(例如,用于404)。前者往往以defroutes形式定义,而后者则是高阶函数。

中间件处理程序在查看请求后自行决定是否要立即返回响应或委托给处理程序。基于路由的“内部”处理程序被调用适当的URI,并且可以选择返回nil以指示请求对它们没有意义(此时剩余的基于路由的处理程序被尝试;如果所有nil输出,则最终响应通常由某些中间件生成,可能返回404)。

我写了一篇关于Compojure here的冗长答案;也许它可能有助于了解Compojure基于路由的处理程序定义。

答案 1 :(得分:1)

我不知道这是否是最佳方法,我最终实现了一个ring.middleware函数,它将其他处理程序包装在主要函数周围:

(defn wrap-ohandler [f handler]
  (fn [req]
    (let [ res (f req) ]
      (if (= res nil) (handler req) res))))

(def handler-wrapped 
  (-> #'main-handler
    (wrap-ohandler #'anotherhandler )
    (wrap-stacktrace)
    (wrap-params)))

这有效,但这是一个好方法吗?