Wei's Note

Gin Learn

概览

与Spring MVC对比

@Controller

RouterGroup.Group() ,路由分组

@RequestMapping

RouterGroup.GET(), RouterGroup.POST()…

@RequestParam

Spring MVC中@RequestParma适用于query, form data , multipart,gin会细分

Context.Query(), Context.DefaultQuery()

Context.PostForm(), Context.DefaultPostForm()

@RequestParam MultiPartFile ↔ Context.FormFile()

@PathVariable

“/url/:param/*action”, Context.Param()

@RequestBody

Bind() 利用content-type和struct tag解析支持url path、header、query、form-data、json、xml等,ShouldBindQuery,ShouldBindJSON

MustBindWith() 异常情况下中断请求并返回400

由于Request.Body只能读取一次,使用ShouldBindBodyWith() 可以缓存Body,对性能有轻微的影响

@Valid JSR303 OR @Validated

@Validated相比较JSR303@Valid 增加了分组校验

type Login struct {
  User     string `json:"user" binding:"required"`
  Password string `json:"password" binding:"required"`
}

@ResponseBody

Context.JSON(), Context.String(), Context.XML(), Context.File()

静态资源

RouterGroup.StaticFile() 返回单个文件

RouterGroup.Static("/static", "/var/www") 返回指定目录下文件

Context.HTML() HTML模版渲染

自定义渲染 Contenxt.DataFromReader() 或者 Contenxt.Render()

HandlerInterceptor

全局的 Engine.Use() 或者 自定义path的RouterGroup.Use()

adminGroup := r.Group("/admin")
adminGroup.Use(func(context *gin.Context) {
    log.Println("admin group accessed")
})

@ExceptionHandler

r.Use(gin.CustomRecovery(func(c *gin.Context, err interface{}) {
		if err, ok := err.(string); ok {
			c.JSON(http.StatusInternalServerError, gin.H{
				"errCode": "internal-error",
				"errMsg":  err,
			})
		}
		c.AbortWithStatus(http.StatusInternalServerError)
	}))

Response.sendRedirect()

Context.Redirect(statusCode, location) 内部或者外部地址都支持

日志

f, _ := os.Create("biz.log")
// 同时输出到文件和控制台
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

特有语法

Context.QueryMap(),Context.PostFormMap()支持我没见过的传参数,/url?param[key1]=values1&param[key2]=value2

主要结构体

Engine

Engine 框架实例,it contains the muxer, middleware and configuration settings.

middleware 可以理解为Spring MVC中的Filter,或者叫中间件, 中间处理函数

Engine 结构

type Engine struct {
	RouterGroup // 嵌套结构体,继承RouterGroup的方法,配置路由,包含前缀和一组处理器
	...//一些其他配置
}

通过New()或者Default()创建Engine

New() 创建一个空白的没有任何middleware的实例

Default() 创建一个带有 LoggerRecovery的实例,engine.Use(Logger(), Recovery())

Use() 创建全局的middleware

gin.LoggerWithFormatter() 请求日志格式化

Context

Cookie管理 c.Cookie() c.SetCookie()

获取客户端IP c.ClientIP()

Header管理 c.Header() c.getHeader()

元数据管理 c.Get() c.Set()

协程中安全使用 c.Copy()

流程控制

c.Next() 仅在middleware中使用,PostHandle处理

c.Abort() 组织后续handler处理,不回停止当前handler,如在授权逻辑中使用