Go言語コワクナイ 第3話

〜echoでHTMLファイルを表示してWebサイトを作ってみよう〜

前回のあらすじ

main.goの

e.GET("/", func(ctx echo.Context) error {
    return ctx.JSON(200, "Hello, World!")
})

e.Static("/", assets)
e.File("/", "public.html")

に書き換えることでhtmlを表示させることができました。


今回はControllerの作成を行っていきます。


じつは、第1回で記述した

e.GET("/", func(ctx echo.Context) error {
    return ctx.JSON(200, "Hello, World!")
})

もControllerの書き方の一つとなっています。


しかし、main.goにひたすらControllerを増やしていくとmain.goの中身が大変なことになってしまいますね。

e.GET("/hello", func(ctx echo.Context) error {
    return ctx.JSON(200, "Hello, World!")
})
e.GET("/dog", func(ctx echo.Context) error {
    return ctx.JSON(200, "わんわん!")
})
e.GET("/cat", func(ctx echo.Context) error {
    return ctx.JSON(200, "にゃー!")
})
...

そこで、Controllerのファイルを分割して作成していきましょう。


hello_controller.goを作成しましょう。

$ mkdir hello
$ mkdir hello/controller
$ touch hello/controller/hello_controller.go

Controllerの中身を作成していきます。

package controller

// HelloController hello controller
type HelloController struct{}

func NewHelloController(e *echo.Echo) {
    handler := &HelloController{}
    e.GET("/", handler.Hello)
}

// Hello hello world
func (c *HelloController) Hello(ctx echo.Context) error {
    return ctx.JSON(200, "Hello, World!")
}

まずHelloControllerの構造体を宣言します。 今回は構造体の要素は空のままで大丈夫です。

type HelloController struct{}

Usecaseなどを使用する場合はControllerの構造体の要素を宣言します。

type HelloController struct{
    HelloUsecase: usecase.HelloUsecase
}

次にNewHelloControllerでcontrollerをmountします。

func NewHelloController(e *echo.Echo) {
    handler := &HelloController{}
    e.GET("/", handler.Hello)
}

handlerには先程宣言したHelloControllerを指定しましょう。


e.GET("/", handler.Hello)

この部分はルーティングになります。 ルーティングはグループ化することができ、

api := e.Group("/api/v1")
api.Get("/", handler.Hello)

のように記載すると/api/v1をprefixに付けることができます。


また、ルーティングにmiddlewareをかけたい場合はe.Groupの第2引数にmiddlewareを指定することによってそのグループにのみmiddlewareをかけることも可能です

auth := e.Group("/api/v2", middleware.Authorization)
auth.POST("/accounts", handler.Create)

e.メソッドの第1引数にはエンドポイント、第2引数にはContollerのメソッドを記載します。 また、この段階でもmiddlewareをかけることも可能です

エンドポイントでpathパラメータを指定することも可能です

e.GET("/hello/:name", handelr.Hello)

では、Controllerのメソッドの実装をしていきましょう。

// Hello hello world
func (c *HelloController) Hello(ctx echo.Context) error {
    return ctx.JSON(200, "Hello, World!")
}

レシーバにはHelloControllerを設定し 引数はecho.Context 返り値はerror型を指定します。 return ctx.JSONの部分は返すレスポンスによって変わってきます。 ここの部分に関しては公式ドキュメントを参照してください。


ここまで書ければ後は、main.goで呼び出せば終了です。

e := echo.New()
controller.NewHelloController(e)

それでは環境を起動してみましょう。

$ go build
$ ./echo-server

localhost:1323にアクセスすると以下のように表示されます。


次回

〜gormを使ってpostgressに接続してみよう〜