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¶m[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()
创建一个带有 Logger
和Recovery
的实例,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,如在授权逻辑中使用