Http 理解魔戒和阿彭金魔法(Clojure)

Http 理解魔戒和阿彭金魔法(Clojure),http,google-app-engine,clojure,httpwebrequest,ring,Http,Google App Engine,Clojure,Httpwebrequest,Ring,我开始开发一些clojure web应用程序,并决定使用Ring+Compojure的组合。 最近我决定用Appengine magic试试Google Appengine(https://github.com/gcv/appengine-magic). 然而,appengine magic(通过其启动函数)和ring的run jetty函数都只接受1个处理程序作为参数,我正在实现几个处理程序,并想知道如何部署它们 提前感谢,, Ze我不知道这是否是最好的方法,我最终实现了一个ring.midd

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

提前感谢,,
Ze

我不知道这是否是最好的方法,我最终实现了一个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)))

这是可行的,但这是一个好方法吗?

始终只有一个顶级处理程序——毕竟,即使在某些概念级别上有多个处理程序,应用程序也需要决定以某种方式将哪个处理程序应用于给定的请求,因此做出选择的例程成为顶级处理程序。因此,简单的回答是,您需要提供一个函数,该函数将查看一个请求,并将其交给应用程序中几个处理程序中的适当处理程序;该函数是要提供给
运行jetty
(或等效程序)的处理程序

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

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


我已经写了一篇关于Compojure的长篇回答;也许这有助于了解Compojure基于路径的处理程序定义。

谢谢,我当时很累,思考不清楚:)这很有道理:)很有趣,我一天前在推特上发了你的另一篇帖子:干杯:)很乐意帮忙。感谢您的友好推文。:-)