Clojure Web Development勉強 - Ring (その3) ResponseとHandler
いろんなresponseの作成を助ける関数群のring.util.responseを少し使ってみる。
前回handlerと読んでいた関数をplain-textと改名し、それに加えてhtmlを返すhtml関数、404を返すnot-found関数、そしてhttp://www.google.comにリダイレクトするredirect関数を定義した。
html関数:
(defn html [req] (-> (res/response "<div> <h1>Hello World!</h1> <p>Some random bit of text</p> </div>") (res/content-type "text/html")))
content-typeがtext/htmlになっているのと、bodyに含まれる文字列が実際のhtmlタグを使った文書になっている。とりあえず、現在は最低限のring機能の紹介ということでテンプレートを使っていない。実際のサイト作成ではまずこのようなhtmlタグのベタ書きはせず、テンプレートライブラリを使うことになる。私はfront-endでreagentを使っているので、それに合わせてhtmlテンプレートはhiccupというclojureデータ構造をフル活用するライブラリを使おうと考えている。
not-found関数:
(defn not-found [req] (-> (res/not-found "<b>Not found!</b>") (res/content-type "text/html")))
res/not-found
を使うことによってレスポンスマップは:status 404
になる。やはりこれも現在はタグベタ打ち。
redirect関数:
(defn redirect [req] (res/redirect "http://www.google.com"))
これで問答無用でグーグル先生に飛ぶ。
あとはこれらのハンドラ関数のどれかを
(def my-app (-> plain-text ;swap this with another handler function logger))
のplain-text
のところに代入してreplに送ればlocalhost:8080
にブラウザでアクセスした時の挙動が変わる。
次回はルーティング、つまりuriに指定されたパスによって表示するコンテンツを変えるという機能を付け加えてみる。