Http 理解魔戒和阿彭金魔法(Clojure)
我开始开发一些clojure web应用程序,并决定使用Ring+Compojure的组合。 最近我决定用Appengine magic试试Google Appengine(https://github.com/gcv/appengine-magic). 然而,appengine magic(通过其启动函数)和ring的run jetty函数都只接受1个处理程序作为参数,我正在实现几个处理程序,并想知道如何部署它们 提前感谢,,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
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基于路径的处理程序定义。谢谢,我当时很累,思考不清楚:)这很有道理:)很有趣,我一天前在推特上发了你的另一篇帖子:干杯:)很乐意帮忙。感谢您的友好推文。:-)