Ring 包含 处理器,中间件,适配器,请求map、响应map。描述如下:
1,处理器(Handlers)
Ring的处理器组成web应用的核心逻辑。处理器是由处理传入的请求map
、生成并返回响应map的Clojure函数实现。
2,中间件(Middleware)
Ring的中间件通过在生成响应的过程中被调用从而增强处理器的功能。
中间件通常实现为接受一个或多个处理器以及配置项作为参数的高阶函数,
并且返回具有期望复合行为的新的处理器。
3,适配器
处理器运行经由适配器,适配器负责实现Http协议并将处理器从它们运行的协议的细节抽象出来。
适配器实现为接受一个处理器和一个配置map的参数的函数,配置map提供了适配器需要的配置项,
例如运行的端口。
一旦初始化,适配器接受Http请求,解析它们去构建请求map,然后将请求map作为一个参数调用
处理器。一旦处理器返回响应map,适配器将使用它去构建并发送一个Http响应给客户端。
4,请求map
请求map是一个至少包含了一下键和对应值的Clojure map:
:server-port (必需,Integer)
请求在哪个端口上被处理。
:server-name (必需,String)
解析后的服务器名或服务ip地址。
:remote-addr (必需,String)
发出请求的客户端或最后的一个代理的ip地址
:uri (必需,String)
请求的URI。必须由“/"开始。
:query-string (可选, String)
请求参数。
:scheme (必须,关键字)
传输协议,必须是:http 或 :https.
:request-method (必需,关键字)
Http请求方法,必须是 :get, :head, :options, :put,:post,:delete中的一个。
:content-type (可选,string)
请求体的MIME类型。
:content-length (可选 ,Integer)
请求体的字节数。
:character-encoding (可选,String)
请求体中使用的编码的名称。
:ssl-client-cert (可选, X509Certificate)
SSL 客户端认证。
:headers (必需,IPersistentMap)
小写字母头和对应值的Clojure map。
:body (可选,InputSteam)
请求提的InputeStream。
5,响应map
响应map是至少包含以下建和对应值的Clojure map。
:status (必需,Integer)
Http状态码,必须大于或等于100。
:headers (必需, IpersistentMap)
一个头字段和值的Clojure map。这些值可能是string,这种情况下一个名称、值对将在Http响应
中返回;还有可能是字符串序列,这样每一个字符串值都将作为一个键值对被返回。
:body (可选,{字符串,ISeq,File,InputStream})
响应体根据他的类型被处理:
String:
内容本身被传回客户端。
ISeq:
序列的每个元素作为字符串被返回给客户端。
File:
制定位置的内容被传给客户端。如果可以服务将使用优化的方法传送这个文件。
InputStream:
内容在流中发送到客户端并且被消费。当流消耗完后,它被关掉。
1,处理器(Handlers)
Ring的处理器组成web应用的核心逻辑。处理器是由处理传入的请求map
、生成并返回响应map的Clojure函数实现。
2,中间件(Middleware)
Ring的中间件通过在生成响应的过程中被调用从而增强处理器的功能。
中间件通常实现为接受一个或多个处理器以及配置项作为参数的高阶函数,
并且返回具有期望复合行为的新的处理器。
(defn wrap-content-type [handler content-type]
(fn [request]
(let [response (handler request)]
(assoc-in response [:headers "Content-Type"] content-type))))
assoc-in 见 http://clojuredocs.org/clojure_core/clojure.core/assoc-in。
这个中间件函数添加 "Content-Type" 头到每个由这个处理器生成的响应中。
如下应用中间件到处理器:
(def app
(wrap-content-type handler "text/html"))
这里定义了一个新的处理器 app,app由处理器 handler和应用了wrap-content-type的中间件构成。
串联宏 (->
) 可以用于将中间件串起来:
(def app
(-> handler
(wrap-content-type "text/html")
(wrap-keyword-params)
(wrap-params)))
3,适配器
处理器运行经由适配器,适配器负责实现Http协议并将处理器从它们运行的协议的细节抽象出来。
适配器实现为接受一个处理器和一个配置map的参数的函数,配置map提供了适配器需要的配置项,
例如运行的端口。
一旦初始化,适配器接受Http请求,解析它们去构建请求map,然后将请求map作为一个参数调用
处理器。一旦处理器返回响应map,适配器将使用它去构建并发送一个Http响应给客户端。
4,请求map
请求map是一个至少包含了一下键和对应值的Clojure map:
:server-port (必需,Integer)
请求在哪个端口上被处理。
:server-name (必需,String)
解析后的服务器名或服务ip地址。
:remote-addr (必需,String)
发出请求的客户端或最后的一个代理的ip地址
:uri (必需,String)
请求的URI。必须由“/"开始。
:query-string (可选, String)
请求参数。
:scheme (必须,关键字)
传输协议,必须是:http 或 :https.
:request-method (必需,关键字)
Http请求方法,必须是 :get, :head, :options, :put,:post,:delete中的一个。
:content-type (可选,string)
请求体的MIME类型。
:content-length (可选 ,Integer)
请求体的字节数。
:character-encoding (可选,String)
请求体中使用的编码的名称。
:ssl-client-cert (可选, X509Certificate)
SSL 客户端认证。
:headers (必需,IPersistentMap)
小写字母头和对应值的Clojure map。
:body (可选,InputSteam)
请求提的InputeStream。
5,响应map
响应map是至少包含以下建和对应值的Clojure map。
:status (必需,Integer)
Http状态码,必须大于或等于100。
:headers (必需, IpersistentMap)
一个头字段和值的Clojure map。这些值可能是string,这种情况下一个名称、值对将在Http响应
中返回;还有可能是字符串序列,这样每一个字符串值都将作为一个键值对被返回。
:body (可选,{字符串,ISeq,File,InputStream})
响应体根据他的类型被处理:
String:
内容本身被传回客户端。
ISeq:
序列的每个元素作为字符串被返回给客户端。
File:
制定位置的内容被传给客户端。如果可以服务将使用优化的方法传送这个文件。
InputStream:
内容在流中发送到客户端并且被消费。当流消耗完后,它被关掉。