💬

golangフレームワークginを使ってみる

2022/03/18に公開

【環境】
MacBook Air (M1, 2020)
OS: MacOS Big Sur version11.6
Docker Desktop for Mac version4.5.0

golangフレームワークのginを使ってみます。

gin.Default()で*Engineを受け取る

router := gin.Default()

ginでは最初にgin.Default()関数で*Engineというインスタンスを生成します。
*EngineにはEndpoint、Middleware、その他Webページ用のTemplateやそこで使われるfuncMapなど様々なものを登録しておくことができます。

gin.Contextとは

gin.Contextを使うことで、URLに付随したパラメータの取得やPOSTで送信されたデータの取得などを行うことができます。
Engineと並んでginの重要な要素です。

Endpointを登録する

router.GET("/", func(ctx *gin.Context) {
	ctx.JSON(200, gin.H{"key": "value"})
})

Endpoint(APIにアクセスするためのURI)を登録できます。
GETやPOSTなどの関数を使い、引数にはPathと実行したい内容を記したHandlerを指定します。
上の例ではJSONを表示しています。

Middlewareを登録する

func main() {
	router := gin.Default()
	router.Use(checkLoggedIn())
	router.GET("/", func(ctx *gin.Context) {
		ctx.JSON(200, gin.H{"key": "value"})
	})
}

func checkLoggedIn() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		fmt.Println("ログイン確認処理 前")
		ctx.Next()
		fmt.Println("ログイン確認処理 後")
	}
}

MiddlewareはEndpoint処理を実行する前後に共通の処理を差し込めます。
*Engine.Use([関数])で登録することができます。
*gin.Context.Next()でEndpointの処理が実行され、その前後にMiddlewareの処理を差し込むことができます。

TemplateやfuncMapを登録する

ginのEngineにTemplateとfuncMap登録し、ブラウザに文字を入力し出力するアプリケーションを作成します。

gin_test
├── go.mod
├── go.sum
├── main.go
└── templates
    ├── index.html
    └── result.html
main.go
package main

import (
	"html/template"
	"strings"

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

func nl2br(text string) template.HTML {
	return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br />", -1))
}

func main() {
	router := gin.Default()
	router.SetFuncMap(template.FuncMap{
		"nl2br": nl2br,
	})
	router.LoadHTMLGlob("templates/*.html")

	router.GET("/", func(ctx *gin.Context) {
		ctx.HTML(200, "index.html", nil)
	})
	router.POST("/result", func(ctx *gin.Context) {
		result, _ := ctx.GetPostForm("result")
		ctx.HTML(200, "result.html", result)
	})

	router.Run()
}

  • *Engine.SetFuncMapでfuncMap(html側で使用できる関数)を登録できます。
    nl2br(\nを<br />に変換する関数)を登録しました。
  • *Engine.LoadHTMLGlobでhtml.templateパッケージのtemplate.ParseGlobとほぼ同じ機能が使えます。
  • *gin.Context.GetPostFormでPOSTで送信されたデータを取得できます。
index.html
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <h1>入力</h1>
        <form method="POST" action="/result">
            <p><textarea name="result" rows="10" cols="40"></textarea></p>
            <p><input type="submit" value="送信" /> 
        </form>
    </body>
</html>

textareaに改行を含めた文字列情報を入力し、送信ボタンを押すとPOST(/result)でサーバーへ送信されます。

result.html
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <h1>出力</h1>
        <p>{{ nl2br . }}</p>
        <p><a href="/">戻る</a></p>
    </body>
</html>

出力結果を表示します。
funcMapに登録したnl2br関数改行を使い改行された結果が表示されます。

参考

https://qiita.com/ozora/items/0597e52b3f9c1759e292
https://qiita.com/Syoitu/items/8e7e3215fb7ac9dabc3a

Discussion