gin 源码阅读
更新日期:
文章目录
gin 是golang流行的web framework,API简单易用,很适用用来做HTTP API开发。
基础结构体
先看下gin最简单的例子,来自于gin的github。先创建一个应用对象,再绑定GET /ping
请求处理函数, 最后run.
1 | package main |
这里上涉及两个比较重要的结构体:
type Engine struct
由gin.Default() 返回的结构体,整个应用的核心type RouterGroup struct
处理请求URL匹配,还有配置请求URL.r.GET("/ping", func(c *gin.Context) {})
即是有使用到这个结构体的方法type Context struct
请求处理函数的上下相关的信息,获取请求参数,发送响应内容等。
模型绑定与校验
gin中的绑定函数分为两类:
- Must bind, 必须绑定,失败就直接返回给客户端。
Bind
,BindJSON
,BindXML
,BindQuery
,BindYAML
,BindHeader
- Should bind, 这类绑定失败返回一个error而不是直接返回, 这样就可以在代码里进行判断并做相应的处理。
ShouldBind
,ShouldBindJSON
,ShouldBindXML
,ShouldBindQuery
,ShouldBindQuery
,ShouldBindHeader
1 | // Binding from JSON |
结构体Login
的字段Tag都包含了binding:"required"
, 用来指定字段必须的校验。 那binding
是在哪里处理的呢? 查看代码 https://github.com/gin-gonic/gin/blob/master/binding/default_validator.go, lazyinit()
中有一段v.validate.SetTagName("binding")
。 gin的readme 有说明使用了go-playground/validator/v10 来做校验, 这段代码就是来指定校验规则使用标签binding
来配置了。
1 | func (v *defaultValidator) lazyinit() { |
还有另外一个问题: 这个validator的校验规则是在什么时候被调用到的呢?肯定是调用c.ShouldBindJSON(&json)
这类函数里的时候了。 最后是进入validate
里了。
1 | // file: gin/context.go |