21
8

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 3 years have passed since last update.

BindJSONとShouldBindJSONの違い(gin)

Last updated at Posted at 2019-10-02

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?