Gin を使って RESTful API を構築する第一歩
link です。
今回は Go 言語のフレームワークである Gin を使って RESTful API を構築してみます。
想定環境
- Windows 11
- Go Programming Language 1.20
Gin とは
Gin は、Golang で書かれた Web フレームワークです。
martini に似た API を持ちながら、非常に優れたパフォーマンスを発揮し、最大で 40 倍高速であることが特徴です。
性能と優れた生産性が必要なら、きっと Gin が好きになれるでしょう。
出典 : Gin Web Framework
Gin とは Go 言語の Web アプリケーションフレームワークです。
同じ Go 言語の martini フレームワークと似た API でありながら、最大で 40 倍パフォーマンスが良いことを特徴としています。
プロジェクト作成
Go 言語のプロジェクトを作成します。
$ mkdir ginrest
$ cd ginrest
$ go mod init ginrest
Gin をダウンロードし、 Gin プロジェクト開始用のテンプレートをダウンロードします。
$ go get -u github.com/gin-gonic/gin
$ curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go
テンプレートのダウンロードが完了すれば、プロジェクトの作成は完了です。
API 作成
ダウンロードしたテンプレート main.go
は以下のようになっています。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
var db = make(map[string]string)
func setupRouter() *gin.Engine {
...各 API の処理
}
func main() {
r := setupRouter()
// Listen and Server in 0.0.0.0:8080
r.Run(":8080")
}
setupRouter()
の 中身を書き換えて main.go
を以下のように変更します。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
var db = make(map[string]string)
func setupRouter() *gin.Engine { r := gin.Default() r.GET("/users", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"users": db}) }) r.GET("/user/:name", func(c *gin.Context) { user := c.Params.ByName("name") value, ok := db[user] if ok { c.JSON(http.StatusOK, gin.H{"user": user, "value": value}) } else { c.JSON(http.StatusOK, gin.H{"user": user, "status": "no value"}) } }) r.POST("/user", func(c *gin.Context) { user := c.PostForm("name") value := c.PostForm("value") db[user] = value c.JSON(http.StatusOK, gin.H{"user": user, "value": db[user]}) }) r.PUT("/user/:name", func(c *gin.Context) { user := c.Params.ByName("name") db[user] = c.Query("value") c.JSON(http.StatusOK, gin.H{"user": user, "value": c.Query("value")}) }) r.DELETE("/user/:name", func(c *gin.Context) { user := c.Params.ByName("name") delete(db, user) c.JSON(http.StatusOK, gin.H{"user": user, "status": "deleted"}) }) return r}
func main() {
r := setupRouter()
r.Run(":8080")
}
setupRouter()
では各ルーティングに対して実行する関数を実装しています。
書き換え後の setupRouter()
で使っている関数について解説します。
gin.Default()
: Web サーバーを生成Params.ByName()
: パスパラメーターを取得Query()
: クエリーパラメーターを取得PostForm()
: フォームパラメーターを取得JSON()
: 返す JSON を生成
Web アプリケーション
go run main.go
コマンドを実行して Web アプリケーションを起動します。
起動後、以下のように表示されます。
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /users --> main.setupRouter.func1 (3 handlers)
[GIN-debug] GET /user/:name --> main.setupRouter.func2 (3 handlers)
[GIN-debug] POST /user --> main.setupRouter.func3 (3 handlers)
[GIN-debug] PUT /user/:name --> main.setupRouter.func4 (3 handlers)
[GIN-debug] DELETE /user/:name --> main.setupRouter.func5 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080
Postman などで localhost:8080
の各ルーティングにリクエストを送信して以下のような動作になっていることを確認しましょう。
GET /users
user
の配列が返ってくる。
GET /user/:name
:name
で指定した user
が返ってくる。
POST /user
フォームパラメーターの name
と value
で指定した値の user
が保存される。
PUT /user/:name
:name
で指定した user
の value
をクエリーパラメーターの value
に更新する。
DELETE /user/:name
:name
で指定した user
を削除する。
参考サイト
まとめ
今回は Go 言語のフレームワークである Gin を使って RESTful API を構築してみました。
それではまた、別の記事でお会いしましょう。