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 14

Clojure: RingでTodoアプリを作る - ルーティング

Last updated at Posted at 2024-12-13

advent_calendar_2024.png

Advent Calendar 2024 Day 14

昨日までで、Todoアプリを作成するための準備が整いました。

今日は実際に実装していきます。

簡単なCRUDのアプリを想定します。

作るリクエストの口としては、

項目 メソッド パス
Todoの作成 POST /v1/todos/{id}
Todo一覧の取得 GET /v1/todos
特定のTodoの取得 GET /v1/todos/{id}
Todoの変更 PUT /v1/todos/{id}
Todoの削除 DELETE /v1/todos/{id}

こんなところでしょうか。

まずはルーティングを作っていきます

ルーティングには compojure を使います

もちろんcompojureを使わなくてもルーティングを表現することはできますが、
使うとソースコードがシンプルになるので今回は採用します

Compojure

まずはプロジェクトに追加します

  :dependencies [[org.clojure/clojure "1.11.1"]
                 [...]
                 [compojure "1.7.1"]]

compojureringと連携することができるので、
defroutesで複数のルーティングを定義し、そのルーティングを読み込みringでサーバーを起動します

個々のルーティングはGETPOSTといったマクロで定義します

(ns todo.core
  (:require [ring.adapter.jetty :as jetty]
            [compojure.core :refer [defroutes GET]]
            [compojure.route :as route]))

(defroutes handler
  (GET "/v1/todos" [] {:status 200 :body "Hello, World!"})
  (route/not-found {:status 404 :body "Not Found"}))

(defn -main []
  (jetty/run-jetty handler {:port 3000}))

これで、GET /v1/todosと、マッチしなかったときの 404 のパターンを作れました

実際にリクエストを送ってみます

$ curl localhost:3000/v1/todos
Hello, World!

$ curl localhost:3000/not-found-path
Not Found

うまくルーティングが設定できたようです。

この調子ですべてのルーティングを作ってしまいます

(defroutes handler
  (POST "/v1/todos" [] {:status 200 :body "作成しました"})
  (GET "/v1/todos" [] {:status 200 :body "Todoの一覧を返します"})
  (GET "/v1/todos/:id" [id] {:status 200 :body (str "Todoを返します(id:" id ")")})
  (PUT "/v1/todos/:id" [id] {:status 200 :body (str "更新しました(" id ")")})
  (DELETE "/v1/todos/:id" [id] {:status 200 :body (str "削除しました(id: " id ")")})
  (route/not-found {:status 404 :body "Not Found"}))

これらにリクエストを送ってみます

# GET /v1/todos
$ curl localhost:3000/v1/todos
Todoの一覧を返します
# GET /v1/todos/:id
$ curl localhost:3000/v1/todos/1
Todoを返します(id:1)
# POST /v1/todos
$ curl localhost:3000/v1/todos -X POST
作成しました
# PUT /v1/todos/:id/:item
$ curl localhost:3000/v1/todos/1/title -X PUT
更新しました(1)
# DELETE /v1/todos/:id
$ curl localhost:3000/v1/todos/1 -X DELETE
削除しました(id: 1)

ちゃんと動いてそうです

明日はミドルウェアを使い、jsonを扱えるようにしていきます

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?