Ring是一个Clojure的Web框架,它与Python的WSGI和Ruby的Rake非常类似。通过把HTTP的细节抽象为简单且模块化的API,Ring允许Web应用程序由模块化组件构成,这些组件可以在各种应用程序、Web服务器和Web框架之间共享,用来构建类型广泛的应用。
Ring充分体现了函数式编程的思想——通过一系列函数的组合形成了一个易于理解、扩展的HTTP处理链。
Ring规范里面有如下5个核心概念:
handlers,应用逻辑处理的主要单元,由一个普通的Clojure函数实现middleware,为handler增加额外功能adapter,将HTTP请求转为Clojure里的map,将Clojure里的map转为HTTP相应requestmap,HTTP请求的map表示responsemap,HTTP相应的map表示这5个组件的关系可用下图表示(By Ring作者):
+---------------+|Middleware||+---------+|+---------++--------+|||<--request----||||||Handler|||Adapter|<---->|Client||||---response-->|||||+---------+|+---------++--------++---------------+HelloWorld
(nslearn-ring.core(:require[ring.adapter.jetty:refer[run-jetty]]))(defnhandler[req]{:headers{}:status200:body"HelloWorld"})(defnmiddleware[handler]"Auditalogperrequest"(fn[req](println(:urireq))(handlerreq)))(defapp(->handlermiddleware))(defn-main[&_](run-jettyapp{:port3000}))运行上面的程序,就可以启动一个 Web应用,然后在浏览器访问就可以返回HelloWorld,同时在控制台里面会打印出请求的uri。
评论