概述 - 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-port The port on which the request is being handled.

  • :server-name 解析服务器名称或者ip

  • :remote-addr 客户端ip地址或者最后请求代理地址

  • :uri URI (域名之后的完整地址)

  • :query-string 查询字符串

  • :scheme 协议, :http 或者 :https.

  • :request-method 请求方法, 有::get, :head, :options, :put, :post, :delete.

  • :content-type MIME类型

  • :content-length 请求body长度

  • :character-encoding 请求body编码

  • :headers Clojure头部映射

  • :body 请求body的输入流

Responses 回应

处理器产生的回应, 包括的键:

  • :status HTTP状态码: 200, 302, 404 等

  • :headers Clojure映射的头部致。这些键值对和字符串集合会随着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经常使用中间件函数。