利用函數呼叫堆疊後進先出的特點,巧妙的完成中間件在自訂處理函數完成的後處理的操作。
django它的處理方式是定義個類,請求處理前的處理的定義一個方法,請求處理後的處理定義一個方法。
gin的方式更靈活,但django的方式更清晰。
請求參數綁定
對於取得請求內容,在模型綁定當中,有以下的場景
- ##綁定失敗是使用者自己處理或框架統一進行處理
- 使用者需是否需要關心請求的內容選擇不同的綁定器
// 自动更加请求头选择不同的绑定器对象进行处理 func (c *Context) Bind(obj interface{}) error { b := binding.Default(c.Request.Method, c.ContentType()) return c.MustBindWith(obj, b) } // 绑定失败后,框架会进行统一的处理 func (c *Context) MustBindWith(obj interface{}, b binding.Binding) (err error) { if err = c.ShouldBindWith(obj, b); err != nil { c.AbortWithError(400, err).SetType(ErrorTypeBind) } return } // 用户可以自行选择绑定器,自行对出错处理。自行选择绑定器,这也意味着用户可以自己实现绑定器。 // 例如:嫌弃默认的json处理是用官方的json处理包,嫌弃它慢,可以自己实现Binding接口 func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error { return b.Bind(c.Request, obj) }