Ring 笔记 - 核心概念

Ring 是一个在 Clojure 中的对于 HTTP 的抽象,是构建 Web 应用的底层接口和库,类似于 Java 中的 Servlet

核心概念

Handler

Handler 是一个定义web应用的函数,其有一个表示 HTTP Request 请求的 map 参数,并返回一个 表示 HTTP Response 的 map

(defn hello-world [request]
   {:status 200
    :headers {"Content-Type" "text/plain"}
    :body "Hello World"})

Request

Request 使用一个 map 表示 HTTP Request 对象,其中还可以通过 moddleware 添加一些自定义的键值对

标准 key 如下:

  • :server-port 端口

  • :server-name 服务器名或IP

  • :remote-addr 客户端IP地址或代理地址

  • :uri 域名后的全路径

  • :query-string 查询字符串

  • :scheme 协议 http 或 https

  • :request-method 请求方式

  • :headers 请求头

  • :body 请求内容

Response

用来代表返回的 HTTP Response,是一个包含三个 key 的 map

  • :status HTTP 状态码

  • :headers 返回的 HTTP headers

  • :body 返回内容

Middleware

Middleware 用于给 handler 添加额外的功能,它需要接受一个 handle 参数,返回一个新的 handler

(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)))

Middleware 在 Ring 中会很频繁的使用,包含参数处理、Session处理、文件上传等都是通过 middleware 完成的

 

posted on 2018-09-22 13:56  _路上  阅读(229)  评论(0编辑  收藏  举报

导航