golang + Echoで実装されたWebサーバにてPOSTされたデータを確認する方法です。
前提条件
- golang
- 1.12
- WebFramework
- https://github.com/labstack/echo
- v4.1.10
Body Dump Middlewareを利用する
Usageで提示されているコードにはrequestを出力する処理がないのでFprintfでos.Stderrに出力します。
e := echo.New()
e.Use(middleware.BodyDump(func(c echo.Context, reqBody, resBody []byte) {
fmt.Fprintf(os.Stderr, "Request: %v\n", string(reqBody))
}))
Skipperで出力を制御する
前述のコードではリクエストされたデータを毎回出力してしまうので、任意のタイミングで出力できるようにSkipperを利用します。Skipperはmiddleware.goで以下のように定義されており、trueを返却した際には当該middlewareは処理を行わずスキップされます。
// Skipper defines a function to skip middleware. Returning true skips processing
// the middleware.
Skipper func(echo.Context) bool
Skipperを使った実装例です。ヘッダーでX-Debug
を受け取った場合のみ出力するようにしてみました。エントリーポイント毎にdumpするしないを変更したり、再度のbuildが必要になる何らかの実装をするよりも楽だと思います。
e.Use(middleware.BodyDumpWithConfig(middleware.BodyDumpConfig{
Skipper: func(c echo.Context) bool {
if c.Request().Header.Get("X-Debug") == "" {
return true
}
return false
},
Handler: func(c echo.Context, reqBody, resBody []byte) {
fmt.Fprintf(os.Stderr, "Request: %+v\n", string(reqBody))
},
}))
実装例
最小限の実装をおこなったmain.goの全体です。
package main
import (
"fmt"
"net/http"
"os"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func dumpHandler(c echo.Context, reqBody, resBody []byte) {
fmt.Fprintf(os.Stdout, "Request: %+v\n", string(reqBody))
}
func main() {
e := echo.New()
e.HideBanner = true
e.HidePort = true
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.Use(middleware.BodyDumpWithConfig(middleware.BodyDumpConfig{
Skipper: func(c echo.Context) bool {
if c.Request().Header.Get("X-Debug") == "" {
return true
}
return false
},
Handler: dumpHandler,
}))
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!\n")
})
e.Logger.Fatal(e.Start(":1323"))
}
最後に
REST APIの提供をしていると「リクエストするとエラーになる」との問い合わせを受けることが多々あります。リクエストされたJSONを簡易に確認できる手段を用意しておくと調査が楽になると思います。