golang で gin を利用している際に、BindJSON と ShouldBindJSON があって名前が似ててどう違うのか気になったので記事にしてみます。間違ってたらご指摘していただけると嬉しいです。
ginについて
Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.
引用:https://github.com/gin-gonic/gin
Goで扱われている、HTTPのウェブフレームワークです。同じお酒の名前のフレームワーク、Martini(https://github.com/go-martini/martini ) よりもパフォーマンスが良いと評判みたいです。
BindJSON vs. ShoulBindJSON
以下にGoDocに基づく比較を書きます( https://godoc.org/github.com/gin-gonic/gin )
BindJSON | ShouldBindJSON |
---|---|
原型:MustBindWith | 原型:ShouldBindWith |
指定されたバインディングエンジンを使用して、渡された構造体ポインターをバインドする。エラーが発生した場合、HTTP 400でリクエストを中止します。 | 指定されたバインディングエンジンを使用して、渡された構造体ポインターをバインドする。 |
つまりはこういうこと↓
ソースコード
//MustBindWith(BindJSON)
func (c *Context) MustBindWith(obj interface{}, b binding.Binding) error {
if err := c.ShouldBindWith(obj, b); err != nil {
c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck
return err
}
return nil
}
//ShouldBindWith(ShouldBindJSON)
func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error {
return b.Bind(c.Request, obj)
}
ShouldBindJSONに、400番でエラーを返す機能を含んでるのがBindJSONなんですね!
BindJSON と ShouldBindJSON のまとめ
今回学んだ違いは
BindJSON | ShouldBindJSON |
---|---|
エラー処理の際に400を返してくれる | エラー処理が内部では施されていない |
独自エラーハンドリング不要 | 独自エラーハンドリング必要 |
エラーハンドリングを独自にやりたい場合は ShouldBindJSONを使うのが良さそうですね!
学びました。
参考
gin(GoDoc):https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindJSON