TL;DR
Clojure の Web アプリケーションライブラリ。HTTP の詳細を、単純で統一された API に抽象化する。Python の WSGI と Ruby の Rack に影響を受けている。
仕組み
Ring は、ハンドラ、リクエスト、レスポンス、ミドルウェアの 4 つの概念でできている。
- ハンドラ: Web アプリケーションを定義する関数。リクエストのマップを受け取り、レスポンスのマップを返す
- リクエスト: HTTP リクエストを表す Clojure のマップ。
:uri、:request-method、:headersなどのキーを持つ - レスポンス: ハンドラが返すマップ。
:status、:headers、:bodyの 3 つのキーを持つ - ミドルウェア: ハンドラを包んで機能を足す高階関数
Web サーバとは、Jetty を組み込んだ ring-jetty-adapter などのアダプタでつなぐ。
例
クライアントの IP アドレスをテキストで返すハンドラ。
(defn what-is-my-ip [request]
{:status 200
:headers {"Content-Type" "text/plain"}
:body (:remote-addr request)})