人工知能技術 セマンティックウェブ技術 オントロジー技術 検索技術 データベース技術 デジタルトランスフォーメーション技術 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/にアクセスすると結果が見える。次回はデータベースの立ち上げと連携について述べる。
コメント
[…] 今回はClojureのringを使ったサーバーの立ち上げまでを述べた。次回はcompojureとclj-httpを使ったルーティングまで述べられればと思う。 […]
[…] 前回まででサーバーの立ち上げまでを行なった。今回はDBの立ち上げとClojureによる接続、制御を行う。 […]
[…] WebサーバーとDBの連携(2) compojureを使ったルーティング […]
[…] WebサーバーとDBの連携(2) compojureを使ったルーティング […]