♻️

【Go】echoでリクエストのパスパラメータとボディを別々にBindしたい

に公開

概要

Goのechoでは、リクエストのパラメータやボディを構造体にBindする機能があります。
ただ、複数回Bindの実行はできないようで、以下のようにパスパラメータとボディを別々にBindしようとした時に2回目のBindでエラーが発生します。

以下がAPIのパス

ech.POST("/test_check/:id1/:id2", service.TestCheck)

以下がhandler


type ProjectParam struct {
	ID1 string `param:"id1"`
	ID2 string `param:"id2"`
}

type ProjectBody struct {
	Name string `json:"name"`
}

func TestCheck(c echo.Context) error {
	param := new(ProjectParam)
	if err := c.Bind(param); err != nil {
		return err
	}
	fmt.Println(param)

	body := new(ProjectBody)
	if err := c.Bind(body); err != nil {
		return err
	}
	fmt.Println(body)

	return nil
}

もちろんパラメータはParamメソッドを使って取得すればよいのですが、何か方法があるのかなと思い少し調べてみました。

前提

  • 使用したechoのバージョンはv4.13.3です。

対応方法

Golang Echo bind path param and json body separatelyのstackoverflowの回答にある通り、DefaultBinderを使用すれば実現できそうです。

実装サンプル

func TestCheck(c echo.Context) error {
	param := new(ProjectParam)
	if err := (&echo.DefaultBinder{}).BindPathParams(c, param); err != nil {
		return err
	}
	fmt.Println(param)

	body := new(ProjectBody)
	if err := (&echo.DefaultBinder{}).BindBody(c, body); err != nil {
		return err
	}
	fmt.Println(body)
	return nil
}

Discussion