引き続きTODOリストを作っていきます。
今回は、Go言語のHTTP Framework gin を導入します。
gin
GoのWeb Frameworkは数多く存在していますが、PHPにおけるLaravelのようなベストがあるわけではないようです。今回は比較的starsの多そうなginを使ってみます。
LaravelはRoutingやリクエストハンドリングだけでなく、ORM、HTMLテンプレートなどなど全部入りのフルスタックフレームワークです。
対して、ginは、HTTPリクエストの処理に特化したフレームワークです。
install
Dockerfileの記述で、ginと、ginでcors設定簡単に行うmiddlewareを導入します。
RUN go get -u github.com/go-sql-driver/mysql \
github.com/gin-gonic/gin \
github.com/gin-contrib/cors
goファイル内でimportします。
import ( ... "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ... )
ルーティング
数回に分けてルーティングを記述してきましたが、Go標準機能だといまいちスッキリかけません。
(下記リンクの"ルーティング"を参照)
【TODOリスト 第5回】一覧・作成API - スマレジエンジニアyushiのブログ
ginだと、このように記述できます。
r := gin.Default() r.GET("/tasks", handleGetAll) r.POST("/tasks", handleStore) r.PUT("/tasks/:id/complete", handleComplete)
スッキリしましたね。
フロントエンドの修正は不要です。これがAPIの強み。
リクエストハンドラ
リクエストハンドラの書き方も少し変わります。
記述量は大きく変わりませんが、application/json
の指定が簡易だったりと、
FWがちゃんと鳩首してくれている感じがします。
func handleGetAll(c *gin.Context) { tasks, err := getTasks(30) if err != nil { panic(err.Error()) } c.JSON(http.StatusOK, tasks) }
タスク完了API
ついでにタスク完了のAPIを追加します。
func completeTask(id string) (err error) { _, err = db.Exec("UPDATE tasks SET status = 1 WHERE id = ?", id) return } func handleComplete(c *gin.Context) { id := c.Param("id") err := completeTask(id) if err == nil { c.JSON(http.StatusOK, "") } else { fmt.Println(err.Error()) c.JSON(http.StatusNotFound, id) } }
フロントエンドはこんな感じ
export function complete(id) { return fetch('http://localhost:8000/tasks/' + id + '/complete', { method: 'PUT', }) }
まとめ
フレームワークはやはり強いです。が、流行り廃りもあるので注意が必要...。