【Ginキャッチアップ①】ローカルホストでサーバを立ててレスポンスを返却する
はじめに
Ginのキャッチアップをしているので、備忘録として学習した内容をアウトプットしていきます。
今回はGinをインストールし、ローカルホストでサーバを立ててレスポンスを返却するところまで実装していきます。
環境
- macOS Monterey 12.4
- VSCode 1.71.0
- go1.19
前提
- go言語の環境セットアップが完了していること
- Go Moduleを理解していること
今回やること
- プロジェクトを作成しGinモジュールをインストールする
- ローカルホストでサーバを立ててJSONを返却する
- ミドルウェアを使ってコンソールにログ出力する
急いでいる人へ
全体のソースコードはこちらになります。
package main
import "github.com/gin-gonic/gin"
import "fmt"
import "net/http"
func main() {
// *Engineインスタンスを生成する
engine:= gin.Default()
// ミドルウェアを登録する
// ミドルウェア ... エンドポイント共通の処理
// *EngineインスタンスのUse関数で登録する
engine.Use(logging())
// エンドポイントを登録する
// *Engineインスタンスの各リクエストメソッド名の関数で登録する
engine.GET("/", func(ctx *gin.Context) {
// 例) JSON形式のメッセージをレスポンス
ctx.JSON(http.StatusOK, gin.H{
"response": "Hello World.",
})
})
// サーバーを立てる(デフォルトはlocalhost:8080)
engine.Run()
// 引数にポート番号を指定可能
// router.Run(":3000")
}
// ログ出力
func logging() gin.HandlerFunc {
return func(ctx *gin.Context) {
fmt.Println("処理開始")
// ctx.Nextでエンドポイントの処理が実行される
ctx.Next()
fmt.Println("処理終了")
}
}
プロジェクトを作成しGinモジュールをインストールする
何はともあれまずはプロジェクトを作成しましょう。
$ cd "path to direstory"
$ mkdir gin_example
$ cd gin_example
$ go mod init go_example
$ go get -u github.com/gin-gonic/gin
$ touch main.go
localhostでサーバを立ててJSONを返却する
作成したmain.goに、ローカルホストでサーバを立てるコードを記述していきます。
package main
import "github.com/gin-gonic/gin"
import "net/http"
func main() {
engine:= gin.Default()
engine.GET("/", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"response": "Hello World.",
})
})
engine.Run()
}
importしているモジュールはそれぞれ下記の用途で使用しています。
パス | 用途 |
---|---|
github.com/gin-gonic/gin | ginそのもの |
"net/http" | レスポンスを定数で扱う際に使用 |
gin.Default
で*Engineインスタンスを生成します。
生成したインスタンスにエンドポイントやミドルウェアなどのさまざまな処理を登録し、WebサービスやAPIを実装していきます。
engine:= gin.Default()
生成したインスタンスにエンドポイントの処理を登録していきます。
GETの場合はengine.GET
、POSTの場合はengine.POST
など
*Engineインスタンスの各リクエストメソッド名の関数に
パスと行う処理の関数を渡す形でエンドポイントごとの処理を登録していきます。
今回は、JSON形式で"Hello World."をレスポンスするエンドポイントを登録します。
engine.GET("/", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"response": "Hello World.",
})
})
"net/http"を使用してレスポンスを定数で扱っていますが、使用しない場合は下記のようになります。
engine.GET("/", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"response": "Hello World.",
})
})
エンドポイントの登録を行った後に、サーバを立てます。
デフォルトのポート番号は8080
です。
engine.Run()
ポート番号を指定したい場合は、Runの引数にポート番号を渡します。
例) 3000を指定する場合
engine.Run(":3000")
ミドルウェアを使ってコンソールにログ出力する
Ginでは、ミドルウェアという仕組みを使ってエンドポイント処理の前後で共通して行う処理を登録できます。
今回はコンソールにログ出力する処理を追記していきます。
package main
import "github.com/gin-gonic/gin"
import "net/http"
// 追記
import "fmt"
func main() {
engine:= gin.Default()
// 追記
engine.Use(func(ctx *gin.Context) {
fmt.Println("処理開始")
ctx.Next()
fmt.Println("処理終了")
})
engine.GET("/", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"response": "Hello World.",
})
})
engine.Run()
}
*Engine.Use
を呼び出すことで、ミドルウェアに共通して行う処理を登録することができます。
*gin.Context.Next
でエンドポイントの処理を実行できるので
これを利用してエンドポイントの処理の前後で処理を行うことができます。
engine.Use(func(ctx *gin.Context) {
fmt.Println("処理開始")
ctx.Next()
fmt.Println("処理終了")
})
参考
Discussion