🗂

【Ginキャッチアップ①】ローカルホストでサーバを立ててレスポンスを返却する

2022/09/19に公開

はじめに

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("処理終了")
})

参考

https://gin-gonic.com/ja/docs/

GitHubで編集を提案

Discussion