こんにちは。KOUKIです。
とあるWeb系企業で、Goエンジニアをやっています。
今日は、Go言語のフレームワークである「Gin」を使ってAPI開発手法を紹介します。
環境
Mac + Chromeで開発します。
Ginとは
Ginは、高パフォーマンスを発揮するWebフレームワークです。
以下の特徴があります。
- シンプルで不変的
- 高速で拡張性が高い
- 効率的な実行やコンパイル
- コミュニティが活発
- ドキュメントが豊富
- 最小限のフレームワークで簡潔
Go自体も結構愛されて来てます。

上から10番目…! 結構微妙か!
プロジェクト準備
プロジェクトを準備しましょう。
1 2 3 4 |
mkdir gin-app cd gin-app/ go mod init gin-app touch main.go |
Hello Appの作成
それでは、Ginで簡単なWebアプリを作っていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// main.go package main import "github.com/gin-gonic/gin" func main() { // routerを作成 router := gin.Default() // 「/」 + GETリクエストでhello worldを返却する router.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world", }) }) // サーバー起動 router.Run() } |
ginでは、最初にrouterを作成します。これはginのDefaultメソッドから呼び出すことで達成できます。
1 2 3 4 5 6 |
func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine } |
次に、このrouterにHTTPリクエストを追加します。これによりリクエストの振り分けができるようになります。
上記のサンプルコードでは、「/」+8080番ポート(後述)にアクセスすると「hello world」の文字列が返却されます。
そして、RunメソッドでWebサーバーを起動する流れです。
このプログラムを実行するには、Terminal上で以下のコマンドを押下します。
1 2 3 4 5 6 7 8 9 10 |
$ go run main.go [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 / --> main.main.func1 (3 handlers) [GIN-debug] Environment variable PORT is undefined. Using port :8080 by default [GIN-debug] Listening and serving HTTP on :8080 |
「[GIN-debug] Listening and serving HTTP on :8080」とあるように、8080番ポートでWeb Serverが起動しました。デフォルトが8080番ポートの様ですが、この番号は開発者が自由に変更できます。
動作確認をしましょう。
1 2 |
$ curl -X GET localhost:8080 {"message":"hello world"} |
完璧ですね!
Port番号の変更も試してみましょう。この場合は、Runメソッドに引数として渡します。
1 2 |
// 5000番ポートでサーバー起動 router.Run(":5000") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ go run main.go [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 / --> main.main.func1 (3 handlers) [GIN-debug] Listening and serving HTTP on :5000 // 8080番 $ curl -X GET localhost:8080 curl: (7) Failed to connect to localhost port 8080: Connection refused // 5000番 $ curl -X GET localhost:5000 {"message":"hello world"} |
簡単ですね。
カスタムHTTPハンドラー
次に、カスタムHTTPハンドラーを実装しましょう。
「*gin.Context」を引数に持つハンドラー関数を定義すればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// main.go package main import "github.com/gin-gonic/gin" // カスタムHTTPハンドラー func home(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world", }) } func main() { router := gin.Default() router.GET("/", home) router.Run(":5000") } |
router.GETがシンプルになったと思います。
パラメータを渡すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// main.go package main import ( "fmt" "github.com/gin-gonic/gin" ) func home(c *gin.Context) { // :nameから値を取り出す name := c.Params.ByName("name") c.JSON(200, gin.H{ "message": fmt.Sprintf("hello %s", name), }) } func main() { router := gin.Default() // :nameを指定 router.GET("/:name", home) router.Run(":5000") } |
ByNameメソッドは、与えられたKey(ここではname)からデータを取得する便利メソッドです。
テストをしてみましょう。Ctl + Cでサーバーを落としてから、もう一度go runコマンドを実行します。
1 2 3 4 |
$ go run main.go $ curl -X GET localhost:5000/selfnote {"message":"hello selfnote"} |
ちゃんとURLに指定したパラメータ(selfnote)が取得できましたね!
柔軟なハンドラー
もっと柔軟なハンドラーを作成可能です。
以下はその例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// main.go package main import ( "encoding/xml" "github.com/gin-gonic/gin" ) type Person struct { XMLName xml.Name `xml:"person"` FirstName string `xml:"firstName,attr"` LastName string `xmml:"lastName,attr"` } func home(c *gin.Context) { c.XML(200, Person{FirstName: "note", LastName: "self"}) } func main() { router := gin.Default() router.GET("/", home) router.Run(":5000") } |
戻り値をXMLにしました。Webサーバーを起動し直して、テストしてみましょう。
1 2 3 4 |
$ go run main.go $ curl -X GET localhost:5000 <person firstName="note"><LastName>self</LastName></person>h |
OKですね。ブラウザからだともっとわかりやすいかもしれません。

次回
次回は、GRUDの実装を行います。
コメントを残す
コメントを投稿するにはログインしてください。