Gin框架中的Bind函数
Bind函數
type Binding interface {Name() stringBind(*http.Request, interface{}) error }Binding 是一個接口,在源碼中,有10個實現了Binding的結構體,以及三個接口
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 最終也是調用了ShouldBindWith, 并對其結果進行判斷。如果有錯,則會返回http 400的狀態碼進行退出。
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) }這個方法是 所有其他綁定方法的基礎,基本上所有的綁定方法都需要用到這個方法來對數據結構進行一個綁定
以上為主要的Binding過程,其他派生出來的BindJSON 和ShouldBindJSON等,為具體的數據類型的快捷方式而已,只是幫我們把具體的binding的數據類型提前給封裝起來,如JSON格式的binding函數。
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())這一句是為了判斷當前的請求方法和contentType,來給context.MustBindWith傳的一個具體的bingding類型。
Json的實現的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 結構體實現了Binding接口的Bind方法,將請求過來的Body數據進行解碼,綁定到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其實就是ShouldBindWith(obj,binding.JSON)的快捷方式。簡單來說,就是在ShouldBindWith(obj,binding.JSON)上面固定了參數,當我們明確規定,body提交的參數內容為json時,簡化了我們的調用和增強了代碼的可讀性
總結
- 當參數比較簡單,不需要結構體進行封裝時,還需要采用context的其他方法來獲取對應的值
- Gin在bind的時候,未對結構體的數據進行有效性檢查,如果對數據有強要求時,需要自己對結構體的數據內容進行判斷
- 建議使用ShouldBIndxxx 函數
總結
以上是生活随笔為你收集整理的Gin框架中的Bind函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SRM管理系统是什么?能为企业带来什么效
- 下一篇: ESC.wsf-JS压缩工具说明及使用