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


☑本記事の内容
  • ミドルウェアについて
  • ベーシック認証
  • ログ出力

ミドルウェアについて

✔>ミドルウェアについての目次
  • ミドルウェアとは
  • 本記事での役割

ミドルウェアとは

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

本記事での役割

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

開発

✔開発の目次
  • ディレクトリ構成
  • ベーシック認証
  • ログ出力

ディレクトリ構成

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")

}

解説

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

ベーシック認証

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

コード

package middlewares

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

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

解説

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

ログ出力

  • Ginにあるログ出力ライブラリを使用
  • 今回はIP・時間・メソッド・パス・ステータスコード・反応時間を出力
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)
	})
}

実行

✔記事内容3の目次
  • POST
  • GET

POST

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

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

GET

  • Talend APIを使用してPOSTする
  • Add authorizationを使いヘッダーに認証情報追
(レスポンス)
[
	{
	"id": 1,
	"name": "yamada"
	}
]
(ログ)
	127.0.0.1 - [2022-12-11T17:39:46+09:00] GET /user 200 7.2435ms 

まとめ

今回の記事についてまとめます。

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

≪ Gin入門①へ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUT US
サカイザ
機械設計→技術営業→SEと転職し、
現在フリーランスエンジニア
北海道出身東京在住
現在、Go案件を受注中
扱えるスキルGo,GCP,Java,AWS,SQL,Python,PHP,etc...
合同会社エンブリオ 代表社員