今日からは実際にTodo
アプリを作っていきます
Todo
アプリを Ring
というライブラリを使って作っていきます
Ringとは
Webアプリケーションを構築するためのライブラリおよび仕様です。
基本構造
Ring
は以下のようなリクエストとレスポンスを扱います
- リクエスト
-
:uri
- リクエストされたパス
-
:request-method
- HTTPメソッド
-
:headers
- HTTPヘッダーのマップ
-
:body
- リクエストの本文
-
- レスポンス
-
:status
- HTTPステータスコード
-
:headers
- レスポンスヘッダーのマップ
-
:body
- レスポンスボディ
-
ハンドラー
ハンドラーは先ほどのリクエストを受け取り、レスポンスを返す関数です。
(defn handler [request]
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"})
ミドルウェア
Ring
はミドルウェアを通じて機能を拡張する仕組みを持っています。
ミドルウェアはハンドラーをラップしてその動作を変更することができます。
例えばリクエストのログを出したりできます。
(defn logging-middleware [handler]
(fn [request]
(println "Request received:" request)
(handler request)))
Ringを使ってみる
まず依存を追加します
project.clj
:dependencies [[org.clojure/clojure "1.11.1"]
[ring/ring-core "1.10.0"]
[ring/ring-jetty-adapter "1.10.0"]]
そしてプロジェクトのエンドポイントを指定します
project.clj
:main todo.core
名前空間todo.core
にエントリーポイントとなる-main
関数を作成します
core.clj
(ns todo.core
(:require [todo.http :as http]
[ring.adapter.jetty :as jetty]))
(defn -main []
(println "アプリケーションを起動します")
(jetty/run-jetty handler {:port 3000}))
前の-main
で使っていましたが、handler
を設定します。
core.clj
(defn handler
[request]
(println request)
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"})
これで簡単なアプリケーションが起動できるようになりました。
core.clj
(ns todo.core
(:require [todo.http :as http]
[ring.adapter.jetty :as jetty]))
(defn handler
[request]
(println request)
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"})
(defn -main []
(println "アプリケーションを起動します")
(jetty/run-jetty handler {:port 3000}))
起動してみます
$ lein run
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
アプリケーションを起動します
起動できました。
リクエストを送ってみます
$ curl localhost:3000
Hello, World!
無事Hello, World
が返ってきました
明日からは本格的にTodoアプリを作っていきます