日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gin框架中的Bind函数

發(fā)布時(shí)間:2024/1/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gin框架中的Bind函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Bind函數(shù)

type Binding interface {Name() stringBind(*http.Request, interface{}) error }

Binding 是一個接口,在源碼中,有10個實(shí)現(xiàn)了Binding的結(jié)構(gòu)體,以及三個接口

context.Bind

func (c *Context) Bind(obj interface{}) error {b := binding.Default(c.Request.Method, c.ContentType())return c.MustBindWith(obj, b) }

Context.MustBindWith

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: errcheckreturn err}return nil }

從注釋和源碼可以看出,MustBindWith 最終也是調(diào)用了ShouldBindWith, 并對其結(jié)果進(jìn)行判斷。如果有錯,則會返回http 400的狀態(tài)碼進(jìn)行退出。

ShouldBindWith

// ShouldBindWith binds the passed struct pointer using the specified binding engine. // See the binding package. func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error {return b.Bind(c.Request, obj) }

這個方法是 所有其他綁定方法的基礎(chǔ),基本上所有的綁定方法都需要用到這個方法來對數(shù)據(jù)結(jié)構(gòu)進(jìn)行一個綁定

以上為主要的Binding過程,其他派生出來的BindJSON 和ShouldBindJSON等,為具體的數(shù)據(jù)類型的快捷方式而已,只是幫我們把具體的binding的數(shù)據(jù)類型提前給封裝起來,如JSON格式的binding函數(shù)。

context.BindJSON

// BindJSON is a shortcut for c.MustBindWith(obj, binding.JSON). func (c *Context) BindJSON(obj interface{}) error {return c.MustBindWith(obj, binding.JSON) }

context.BindJSON 從源碼分析,僅僅比Bind方法少了一句

b := binding.Default(c.Request.Method, c.ContentType())

這一句是為了判斷當(dāng)前的請求方法和contentType,來給context.MustBindWith傳的一個具體的bingding類型。

Json的實(shí)現(xiàn)的Binding接口如下

func (jsonBinding) Bind(req *http.Request, obj interface{}) error {if req == nil || req.Body == nil {return fmt.Errorf("invalid request")}return decodeJSON(req.Body, obj) }

jsonBinding 結(jié)構(gòu)體實(shí)現(xiàn)了Binding接口的Bind方法,將請求過來的Body數(shù)據(jù)進(jìn)行解碼,綁定到obj里面去

ShouldBindJSON

// ShouldBindJSON is a shortcut for c.ShouldBindWith(obj, binding.JSON). func (c *Context) ShouldBindJSON(obj interface{}) error {return c.ShouldBindWith(obj, binding.JSON) }

從源碼注解來看,ShouldBindJSON其實(shí)就是ShouldBindWith(obj,binding.JSON)的快捷方式。簡單來說,就是在ShouldBindWith(obj,binding.JSON)上面固定了參數(shù),當(dāng)我們明確規(guī)定,body提交的參數(shù)內(nèi)容為json時(shí),簡化了我們的調(diào)用和增強(qiáng)了代碼的可讀性

總結(jié)

  • 當(dāng)參數(shù)比較簡單,不需要結(jié)構(gòu)體進(jìn)行封裝時(shí),還需要采用context的其他方法來獲取對應(yīng)的值
  • Gin在bind的時(shí)候,未對結(jié)構(gòu)體的數(shù)據(jù)進(jìn)行有效性檢查,如果對數(shù)據(jù)有強(qiáng)要求時(shí),需要自己對結(jié)構(gòu)體的數(shù)據(jù)內(nèi)容進(jìn)行判斷
  • 建議使用ShouldBIndxxx 函數(shù)

總結(jié)

以上是生活随笔為你收集整理的Gin框架中的Bind函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。