WebサーバーとDBとの連携(2)Clojureでのルーティング

人工知能技術 セマンティックウェブ技術 オントロジー技術 検索技術    データベース技術  デジタルトランスフォーメーション技術  Visualization & UX   ワークフロー&サービスプログラミング Clojure

機械学習等の結果をデータベースに入れて活用することを目的として、前回はまずサーバーの立ち上げまで行った。次のステップとしてルーティングを述べたい。

今回は、compojureについて紹介する。compojureはウェブアプリケーションに必須な機能の一つであるルーティングを担うものとなる。ルーティングとは「クライアントのリクエスト内容と、サーバーの処理内容を紐付ける作業」と定義される。

クライアントのリクエスト内容とは(1)HTTPメソッド、(2)リクエストURL、(3)クライアントがサーバーに送信するデータとなる。「HTTPメソッド」とは「GET(データの取得)」「POST(データの送信(主に新規作成))」「PUT(データの送信(主に既存データの更新))」「DELETE(データの削除)」の4つのサーバーに対する指示となり、「リクエストURL」とは、Webページを取得するときなどに指定するURL、「クライアントがサーバーに送信するデータ」は送信するデータとなる。compojureでのコード例は以下のようになる。

(defroutes handler
  (GET "/" req home)
  (GET "/my-page" req my-page))

上記のコードは、ウェブページのアドレス(例:http:localhost:8080/やhttp:localhost:8080/my-pageに”req”データが来た時に、homeやmy-pageで表される変数や関数を送る(GETが来た時に取得させる)ことを示す。

具体的なコードの流れとしては、project.cljのdependenciesに以下のようにライブラリ指定を追加する。

:dependencies [[org.clojure/clojure "1.10.1"]
                           [ring "1.8.2"]
                           [compojure "1.6.2"]]

上記のコードを追加すると、REPL動作時に自動的にライブラリのウェブからの追加が始まるが、その前にアプリのあるフォルダのトップからターミナルで「lein deps」を行いライブラリのダウンロードを行っても良い。このコマンドは外部レポジトリからライブラリをダウンロードしてPC内のローカルレポジトリに格納する作業を行なってくれる。

次に、srcのcore.cljファイルのnsを以下に書き換える。

(ns todo-clj.core
  (:require [compojure.core :refer [defroutes context GET]]
            [compojure.route :as route]
            [ring.adapter.jetty :as server]
            [ring.util.response :as res]))

これは、先ほど指定したライブラリ(ローカルレポジトリにダウンロードしたもの)をコード内にインポートする関数となる。

次にhandler関数として以下のコードを加える。

(defroutes handler
  (GET "/" req home)
  (GET "/my-page" req my-page)
  (route/not-found "<h1>404 page not found</h1>"))

さらにレスポンスデータのheader部を指定する関数を加える。

(defn html [res]
  (res/content-type res "text/html; charset=utf-8"))

上記はring.util.response ライブラリにある ring.util.response/content-type 関数を利用する。これはレスポンスマップとヘッダーの Context-Type に設定するバリューを受け取り、レスポンスマップのヘッダーの "Context-Type" キーに受け取ったバリューを設定することを示している。

さらにhandlerの中で定義したhomeとmy-pageの関数を定義する。

(defn home [req]
  (-> (home-view req)
      res/response
      html))

(defn my-page [req]
  (-> (my-page-view req)
      res/response
      html))

上記で使われているring.util.response/response は、body を受け取りレスポンスマップを生成する関数となる。次に、home-viewとmy-page-viewを以下のように定義する。

(defn home-view [req]
  "<h1>ホーム画面</h1>
   <a href=\"/home\">ホーム 一覧</a>")
(defn my-page-view [req]
  "<h1>マイページ画面</h1>
   <a href=\"/my-page\">マイページ 一覧</a>")

上記はviewとしてHTMLデータを直接記述している。これらをClojureの関数(hiccup等)で表現する手段もあるがそれらは後日述べることにする。最後に前述のサーバーのセッティングのコードを加えれば、サーバー立ち上げからルーティングまでができる。

(defonce server (atom nil))

(def app
  (routes
   handler))

(defn start-server []
  (when-not @server
    (reset! server (server/run-jetty #'app {:port 3000 :join? false}))))

(defn stop-server []
  (when @server
    (.stop @server)
    (reset! server nil)))

(defn restart-server []
  (when @server
    (stop-server)
    (start-server)))

前回と同様に、spacemacs上でREPLして、localhost:3000/にアクセスすると結果が見える。次回はデータベースの立ち上げと連携について述べる。

コメント

  1. […] 今回はClojureのringを使ったサーバーの立ち上げまでを述べた。次回はcompojureとclj-httpを使ったルーティングまで述べられればと思う。 […]

  2. […] 前回まででサーバーの立ち上げまでを行なった。今回はDBの立ち上げとClojureによる接続、制御を行う。 […]

  3. […] WebサーバーとDBの連携(2) compojureを使ったルーティング […]

  4. […] WebサーバーとDBの連携(2) compojureを使ったルーティング […]

タイトルとURLをコピーしました