golangフレームワークginを使ってみる
【環境】
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
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で送信されたデータを取得できます。
<!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)でサーバーへ送信されます。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>出力</h1>
<p>{{ nl2br . }}</p>
<p><a href="/">戻る</a></p>
</body>
</html>
出力結果を表示します。
funcMapに登録したnl2br関数改行を使い改行された結果が表示されます。
参考
Discussion