Arantium Maestum

プログラミング、囲碁、読書の話題

Clojure Web Development勉強 - Ring (その3) ResponseとHandler

いろんなresponseの作成を助ける関数群のring.util.responseを少し使ってみる。

gist.github.com

前回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に指定されたパスによって表示するコンテンツを変えるという機能を付け加えてみる。