8
Help us understand the problem. What are the problem?

posted at

updated at

BindJSONとShouldBindJSONの違い(gin)

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でリクエストを中止します。 指定されたバインディングエンジンを使用して、渡された構造体ポインターをバインドする。

つまりはこういうこと↓

ソースコード

context.go

//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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
8
Help us understand the problem. What are the problem?