Gin入門 Go

Gin入門② ミドルウェア追加 ~ Go言語 フレームワーク ~


[box class="blue_box" title="☑本記事の内容"]

  • ミドルウェアについて
  • ベーシック認証
  • ログ出力

[/box]

[box class="glay_box" title="Contents"]

  1. ミドルウェアについて
    1. ミドルウェアとは
    2. 本記事での役割
  2. 開発
    1. ディレクトリ構成
    2. ベーシック認証
    3. ログ出力
  3. 実行
    1. POST
    2. GET
  4. まとめ

[/box]

ミドルウェアについて

[box class="yellow_box" title="✔>ミドルウェアについての目次"]

  • ミドルウェアとは
  • 本記事での役割

[/box]

ミドルウェアとは

[box class="green_box"]

  • OSとアプリケーションの間に入って補佐をする役割のソフトウェア
  • Webアプリの場合は認証やデータベース管理サーバーとの接続などを行う

[/box]

本記事での役割

[box class="green_box"]

  • 本記事ではベーシック認証、ログ出力をするために追加する

[/box]

開発

[box class="yellow_box" title="✔開発の目次"]

  • ディレクトリ構成
  • ベーシック認証
  • ログ出力

[/box]

ディレクトリ構成

gin-started
├─go.mod
├─go.sum
├─main.go
├─controller
│ └─user_controller.go
├─middlewares
│ ├─basic_auth.go
│ └─logger.go
├─model
│ └─user.go
└─service
  └─user_service.go

コード

  • main.go
package main

import (
	"gin-start/controller"
	"gin-start/middlewares"
	"gin-start/service"

	"github.com/gin-gonic/gin"
	gindump "github.com/tpkeeper/gin-dump"
)
	
var (
	userService    service.UserService       = service.New()
	userController controller.UserController = controller.New(userService)
)

func main() {

	router := gin.New()
	router.Use(gin.Recovery(), middlewares.Logger(), middlewares.BasicAuth(), gindump.Dump())

	router.GET("/user", func(ctx *gin.Context) {
		ctx.JSON(200, userController.FindAll())
	})

	router.POST("/user", func(ctx *gin.Context) {
		ctx.JSON(200, userController.Save(ctx))
	})

	router.Run("localhost:8080")

}

解説

[box class="glay_box"]

  • gin.Default()からgin.New()に変更して、自身で作成したloggerを使用出来るようにする
  • gin.Recovery()-パニックが発生した際に復帰してステータスコード500を返却せるようにする
  • middlewares.Logger()-自身で作成したlogger関数
  • middlewares.BasicAuth()-自身で作成したBasicAuth関数
  • gindump.Dump()-Request,ResponseのHeader,Bodyを出力してくれる外部パッケージ

[/box]

ベーシック認証

[box class="green_box"]

  • Ginにある簡易的な認証ライブラリ
  • ユーザー名・パスワードを設定することが出来る

[/box]

コード

package middlewares

import "github.com/gin-gonic/gin"

func BasicAuth() gin.HandlerFunc {
	return gin.BasicAuth(gin.Accounts{
		"tanaka": "tarou",
	})
}

解説

[box class="glay_box"]

  • 今回の場合ユーザー名:tanaka、パスワード:tarouを設定

[/box]

ログ出力

[box class="green_box"]

  • Ginにあるログ出力ライブラリを使用
  • 今回はIP・時間・メソッド・パス・ステータスコード・反応時間を出力

[/box]

package middlewares

import (
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
)

func Logger() gin.HandlerFunc {
	return gin.LoggerWithFormatter(func(params gin.LogFormatterParams) string {
		return fmt.Sprintf("%s - [%s] %s %s %d %s \n",
			params.ClientIP,
			params.TimeStamp.Format(time.RFC3339),
			params.Method,
			params.Path,
			params.StatusCode,
			params.Latency)
	})
}

実行

[box class="yellow_box" title="✔記事内容3の目次"]

  • POST
  • GET

[/box]

POST

[box class="green_box"]

  • Talend APIを使用してPOSTする
  • Add authorizationを使いヘッダーに認証情報追加

[/box]
実行
実行

BODY
{
	"id": 1,
	"name": "yamada"
}
(ログ)
127.0.0.1 - [2022-12-11T17:41:07+09:00] POST /user 200 10.2352ms

GET

[box class="green_box"]

  • Talend APIを使用してPOSTする
  • Add authorizationを使いヘッダーに認証情報追

[/box]

(レスポンス)
[
	{
	"id": 1,
	"name": "yamada"
	}
]
(ログ)
	127.0.0.1 - [2022-12-11T17:39:46+09:00] GET /user 200 7.2435ms 

まとめ

今回の記事についてまとめます。
[box class="red_box" title="ポイント" ]

  • ミドルウェアを使用することで認証など様々なことを行える
  • Ginにはログ出力ライブラリが存在し、出力したいログを出力することが出来る

[/box]

≪ Gin入門①へ

-Gin入門, Go