8
5

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.

golang EchoでPOSTされたデータを確認する方法

Posted at

golang + Echoで実装されたWebサーバにてPOSTされたデータを確認する方法です。

前提条件

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を簡易に確認できる手段を用意しておくと調査が楽になると思います。

8
5
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
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?