♻️
【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