20
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go WEBフレームワークEchoでmiddlewareを自作する

Last updated at Posted at 2016-09-29

発端

Go言語の高パフォーマンスWAFであるEchoを利用したアプリを開発している際、 特定のクエリパラメータ値が一致しなけれ処理を通さない という要件があった。各ルート以下でいちいちQueryParamをvalidするのも馬鹿らしく、なんとかしてミドルウェアと模索した結果、割と簡単に出来たのでメモ程度に共有。

echoのmiddleware

expressよろしくnextで繋いでいくスタイルらしい。そんなわけで下記コード。

main.go
package main

import (
	"net/http"
	"os"

	"github.com/labstack/echo"
	"github.com/labstack/echo/engine/standard"
	"github.com/labstack/echo/middleware"
)

// CustomMiddleware
func CustomMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
	
		// QueryParam ?hoge=にあるパラメータを取得
		hoge := c.QueryParam("hoge")
		
		if hoge != os.Getenv("hoge") {
			
			// 一致してなければUnauthorizedを返す(ステータスは適当)
        	return echo.NewHTTPError(http.StatusUnauthorized)
		}
		return next(c)
	}
}

func main() {
	e := echo.New()

	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// 自作ミドルウェアをグループ化
	m := e.Group("", CustomMiddleware)

	// グループに適用させるルーティング
	m.GET("/", func(c echo.Context) error {
		return c.Render(http.StatusOK, "index", "HOGEHOGE")
	})
	m.POST("api/v1/upload", Upload)
	m.GET("api/v1/download", Download)

	// App Server Run
	e.Run(standard.New(":" + os.Getenv("PORT")))
}

これで想定どおりに動いた。コツはGroupのmiddlewareとして動作させることで、単純にe.Use(...)とかやると全体にかかりすぎて、htmlやcssといったstaticなコンテンツの取得にまで影響してしまった。あくまでもルーティングパスのみに掛けること。

20
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?