概述 - snakevash/ring-clojure-doc-cn GitHub Wiki
Ring的web应用一般有四个组件:
- Handler 处理器
- Request 请求
- Response 回应
- Middleware 中间件
Handlers 处理器
处理器就是你定义web应用的函数。处理器获得一个参数,一组HTTP请求描述和返回的一组HTTP回应。
示例:
(defn what-is-my-ip [request]
{:status 200
:headers {"Content-Type" "text/plain"}
:body (:remote-addr request)})
函数返回HTTP回应映射。 回应是远程访问ip地址文本。
处理器函数能够通过各种各样的不同方法来组合成一个web应用。
Requests 请求
HTTP请求表现为Clojure映射,有许多标准键,中间件也可以增加自定义键。
标准键:
-
:server-portThe port on which the request is being handled. -
:server-name解析服务器名称或者ip -
:remote-addr客户端ip地址或者最后请求代理地址 -
:uriURI (域名之后的完整地址) -
:query-string查询字符串 -
:scheme协议,:http或者:https. -
:request-method请求方法, 有::get,:head,:options,:put,:post,:delete. -
:content-typeMIME类型 -
:content-length请求body长度 -
:character-encoding请求body编码 -
:headersClojure头部映射 -
:body请求body的输入流
Responses 回应
处理器产生的回应, 包括的键:
-
:statusHTTP状态码: 200, 302, 404 等 -
:headersClojure映射的头部致。这些键值对和字符串集合会随着response发送到客户端, -
:body渲染的body。可有4种状态:-
String字符串 -
ISeq序列字符串 -
File文件 -
InputStream文件流
-
Middleware
中间件是高阶函数,用来增加处理器额外功能。所需第一个参数为初期,返回值为一个新处理器。
示例:
(defn wrap-content-type [handler content-type]
(fn [request]
(let [response (handler request)]
(assoc-in response [:headers "Content-Type"] content-type))))
这个中间件函数为所有头增加内容类型。
应用示例:
(def app
(wrap-content-type handler "text/html"))
定义了一个新处理器。
(->) 可以用在链式调用
(def app
(-> handler
(wrap-content-type "text/html")
(wrap-keyword-params)
(wrap-params)))
Ring经常使用中间件函数。