TaNA LABO
エンジニアリング

May 24, 2020

Go
Gin
Docker
初心者

Golang+Gin+Dockerでの環境構築とJSONレスポンスのRESTfulAPI開発

post 42

Golangが利用される用途で最も多いAPI開発(あくまで噂)

フレームワークも多数あり、2020年時点では PHPにおけるLaravel的なもの が無いようなので、まずは 学習コスト低め + 情報量の多いgo-gin に触れてみた(フレームワーク使わない勢も結構いる模様)

公式ドキュメントのみで 環境構築 〜 単体試験 のサンプル実装まではサクサク進んだ!!

Docker環境構築

docker-composeで go-gin の動作環境を構築。

# ディレクトリ構造
.
├──  docker-compose.yml
└──  main.go

docker-compose.ymlを定義。

version: '3'
services:
  app:
    image: golang:latest         # ベースイメージ
    container_name: go_container # プロジェクト名
    tty: true                    # プロセスの常時起動
    ports:                       # ポートフォワーディング(ホスト/コンテナ)
      - "8080:8080"
    volumes:
      - .:/go

docker-composeを起動後にgo-ginインストール。

$ docker-compose up -d
$ docker-compose exec app bash
$ go get github.com/gin-gonic/gin

go-ginでのHello World

main.go内に以下のプログラムを追記。

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	router.GET("/hello", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello World")
	})
	router.Run(":8080")
}

goプログラムを実行。

$ go run main.go

JSONレスポンス

main.go内に以下のプログラムを追記。

router.GET("/json", func(c *gin.Context) {
  var msg struct {
    Name string
    Message string
    Number int
  }
  
  msg.Name = "Lena"
  msg.Message = "hey"
  msg.Number = 123
  c.JSON(http.StatusOK, msg)
})

goプログラムを実行して、以下URLでアクセス。

[実行結果] {"Name":"Lena","Message":"hey","Number":123}
http://localhost:8080/json

testifyでの単体試験

testifyのインストール。

$ go get github.com/stretchr/testify

main.go内に以下のプログラムを追記。

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func setupRouter() *gin.Engine {
	r := gin.Default()
	r.GET("/hello", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello World")
	})
	return r
}

func main() {
	r := setupRouter()
	r.Run(":8080")
}

新規にmain_test.go作成。

package main

import (
	"net/http"
	"net/http/httptest"
	"testing"
	"github.com/stretchr/testify/assert"
)

func TestPingRoute(t *testing.T) {
	router := setupRouter()
	w := httptest.NewRecorder()
	req, _ := http.NewRequest("GET", "/hello", nil)
	router.ServeHTTP(w, req)

	assert.Equal(t, 200, w.Code)
	assert.Equal(t, "Hello World!!", w.Body.String())
}

ステータスコードとレスポンス値を確認。

go test

参考文献

■ Golang
Golang フレームワーク比較
Go言語の初心者が見ると幸せになれる場所

■ go-gin
gin-gonic@github
Gin Web Framework
XML / JSON / YAML / ProtoBuf rendering
Go言語でテスト作成 testifyの基本的な使い方

■ API開発ハンズオン
[Golang + Docker]GinをDocker上で試してみる
Go / Gin で超簡単なWebアプリを作る
go-ginでサクッとRESTAPIを構築する


©Copyright2020 TaNA LABO. All Rights Reserved.