昨日までで、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"]]
compojure
はring
と連携することができるので、
defroutes
で複数のルーティングを定義し、そのルーティングを読み込みring
でサーバーを起動します
個々のルーティングはGET
やPOST
といったマクロで定義します
(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を扱えるようにしていきます