Ring 笔记 - 核心概念
核心概念
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 完成的