今日からは実際に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を使ってみる
まず依存を追加します
:dependencies [[org.clojure/clojure "1.11.1"]
[ring/ring-core "1.10.0"]
[ring/ring-jetty-adapter "1.10.0"]]
そしてプロジェクトのエンドポイントを指定します
:main todo.core
名前空間todo.coreにエントリーポイントとなる-main関数を作成します
(ns todo.core
(:require [todo.http :as http]
[ring.adapter.jetty :as jetty]))
(defn -main []
(println "アプリケーションを起動します")
(jetty/run-jetty handler {:port 3000}))
前の-mainで使っていましたが、handlerを設定します。
(defn handler
[request]
(println request)
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello, World!"})
これで簡単なアプリケーションが起動できるようになりました。
(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アプリを作っていきます
