Ring简介

来源:互联网 发布:java关键词过滤 编辑:程序博客网 时间:2024/05/14 02:07
Ring 包含 处理器,中间件,适配器,请求map、响应map。描述如下:


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:
    内容在流中发送到客户端并且被消费。当流消耗完后,它被关掉。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信支付月限额怎么办 微信超额20万怎么办 微信支付超额了怎么办 微信零钱超额了怎么办 微信的充值冲错了怎么办 有流量还扣话费怎么办 自动取款机充值到电子账户怎么办 淘宝qb充错了怎么办 q币冲错了人家不给怎么办 qq充值话费错号怎么办 qq充错号码了怎么办 qq交话费不到账怎么办 充错手机号码而且是空号怎么办 微信钱包充错话费怎么办 QQ充值话费充到空号了怎么办 给别人充错话费怎么办 用qq交错话费对方是空号怎么办 号码变成空号了怎么办 qq冲流量冲错了怎么办 流量冲错了套餐怎么办 微信流量充错号码怎么办 微信支付不进账怎么办 充话费充不进去怎么办 用支付宝充话费没到账怎么办 支付宝充话费未到账怎么办 话费充了不到账怎么办 转转买家不确认收货怎么办 充话费错了怎么办啊 淘宝充值流量没到账怎么办 微信手机充错了怎么办 支付宝充话费没到账怎么办 裤子摔了一个洞怎么办 顾客反应衣服质量不好怎么办 淘宝买的衣服味道很大怎么办 三国杀账号忘了怎么办 宽带连接被删了 怎么办 手机被偷了qq怎么办 手机丢了微信怎么办啊 手机店把手机修坏了怎么办 在手机店买到山寨机手机怎么办 有人在qq群上骂我怎么办