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

関連

出典