0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ひとりカレンダー】ClojureAdvent Calendar 2024

Day 12

Clojure: RingでTodoアプリを作る - Ringとは

Last updated at Posted at 2024-12-11

advent_calendar_2024.png

Advent Calendar 2024 Day 12

今日からは実際に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アプリを作っていきます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?