スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

【TODOリスト 第6回】HTTP Framework(gin)

引き続きTODOリストを作っていきます。

yushi-dev.hatenablog.com

今回は、Go言語のHTTP Framework gin を導入します。

gin

GoのWeb Frameworkは数多く存在していますが、PHPにおけるLaravelのようなベストがあるわけではないようです。今回は比較的starsの多そうなginを使ってみます。

github.com

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',
  })
} 

まとめ

フレームワークはやはり強いです。が、流行り廃りもあるので注意が必要...。