中间件

基本定义

gin里面本身就有中间件,脚手架里对中间件做了简单的封装

接口定义

type Fairing interface {
    OnRequest(*gin.Context) error
    OnResponse(result interface{}) (interface{}, error)
}

OnRequest: 执行控制器方法前,修改如头信息、判断参数等等

OnResponse:执行控制器方法后。可以修改返回值内容

创建全局中间件

type TokenCheck struct {}
func NewTokenCheck() *TokenCheck {
   return &TokenCheck{}
}
func(this *TokenCheck) OnRequest(ctx *gin.Context) error{
      return nil
}
func(this *TokenCheck) OnResponse(result interface{}) (interface{}, error){
   return result,nil  
}

注意点:两个方法必须都有返回值。

type AddVersion struct {

}
func NewAddVersion() *AddVersion {
   return &AddVersion{}
}
func(this *AddVersion) OnRequest(ctx *gin.Context) error{
   return nil
}
func(this *AddVersion) OnResponse(result interface{}) (interface{}, error){
   if m,ok:=result.(gin.H);ok{
      m["version"]="0.3.0"
      return m,nil
   }
   return result,nil
}

注册全局中间件

func main()  {
   Web.New().
      Attach(NewTokenCheck(),NewAddVersion()).
      Mount("v1",NewIndexController()).
      Launch()
}

注册路由中间件

type CheckVersion struct {

}

func NewCheckVersion() *CheckVersion {
   return &CheckVersion {}
}
func(this *CheckVersion) OnRequest(ctx *gin.Context) error{
   if ctx.Query("wike")==""{
      Web.Throw("wike requred",503,ctx)
   }
   return nil
}
func(this *CheckVersion) OnResponse(result interface{}) (interface{}, error){
   return result,nil
}
type CheckName struct {

}

func NewCheckName() *CheckName {
   return &CheckName {}
}
func(this *CheckName ) OnRequest(ctx *gin.Context) error{
   if ctx.Query("wike")==""{
      Web.Throw("wikerequred",503,ctx)
   }
   return nil
}
func(this *CheckName ) OnResponse(result interface{}) (interface{}, error){
   return result,nil
}
func(this *IndexController) Build(goft *Web.Goft){
   goft.HandleWithFairing("GET","/index",this.Index, NewCheckName(),NewCheckVersion()).

最后更新于

这有帮助吗?