Mvc含义:在实际的开发中,程序功能往往是分层来进行开发的,controller层只负责控制和处理接口请求的逻辑,具体的功能调用,往往由另外称为service层的功能服务层来进行实现。
1、下载并安装
go get -u github.com/gin-gonic/gin
2、路由
(1)创建路由
在gin框架中,Engine被定义一个结构体,Engine代表gin框架的一个结构体定义,其中包含了路由组,中间件,页面渲染借口,框架配置设置等相关内容。默认的 Engine可以通过gin.Defult进行创建,或者使用gin.New()也可以创建:
imoirt(
"github.com/gin-gonic/gin "
)
router := gin.Default()
router := gin.New()
router.Run()
二者区别在于Default也适用New创建的实例,但默认使用Logger和Recovery中间件,Logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试;Recovery中间件的作用是如果程序执行过程中遇到panic中断了服务,则Recovery会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的gin.Default创建Engine实例。
(2)处理HTTP请求
协议中定义了一共八种方法或者成为类型的来表明请求网络资源的不同操作方式,分别是GET,POST,PUT,OPTIONS,HEAD,DELETE,TRACE,CONNECT
<1>通用处理
func (group * RouterGroup)Handle (httpMethod, relatvePath string, handlers ...HandlerFunc) IRoutes
httpMethod: 表示处理的HTTP的请求类型
relatvePath:要解析的接口
handlers: 处理请求
<2>分类请求
除了engine中包含的通用的处理方法以外,engine还可以按类型进行直接解析。engine中包含有get方法、post方法、delete方法等与http请求类型对应的方法。
router.Get("/hello", func(context *gin.Context) {
函数体....
})
router.Post(
"/hello", func(context *gin.Context) {
函数体....
})等等
函数名称代表处理的HTTP请求类型,第一个参数表示要解析的接口,第二个参数表示处理请求
(3)获取参数
<1>api参数
使用Context的Param方法来获取API参数
router := gin.Deault()
router.GET("/hello", func(ctx *gin.Context) {
name := ctx.Param("name")
})
router.Run(":8080")
<2>URL参数
URL参数可以通过DefaultQuery()和Query()方法获取
user := ctx.DefaultQuery("name", "passwrod")
user := ctx.Query("name")
<3>表单参数
表单传输为post请求,http常见的传输格式为四种:
application/json
application/x-www-form-urlencoded
application/xml
multipart/form-data
表单参数可以PostForm()方法获取:
types := ctx.DefaultPostForm("types", "post")
username := ctx.PostForm("username")
password := ctx.PostForm("userpassword")
userID := context.Param("id")
(4)参数实体绑定
使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着参数。gin框架提供了数据结构体和参数提交数据绑定的功能,提高参数数据获取的效率。
//用户注册
type UserRegister struct {
Username string `form:"username" binding:"required" json:"username"`
}
ShouldBindQuery可以实现Get方式的数据请求的绑定。具体实现如下:
var userRegister UserRegister
err := context.ShouldBindQuery(&userRegister) //返回值是一个err
ShouldBind可以实现Post方式的提交数据的绑定工作。具体实现如下:
var userRegister UserRegister
err := context.ShouldBind(&userRegister) //返回值是一个err
ShouldBindJson对数据进行绑定并自动解析,具体实现如下:
var userRegister UserRegister
err := context.BindJSON(&userRegister) //返回值是一个err
<4>路由组
routes group是为了管理一些相同的URL
userGroup := engine.Group("/user")
{
userGroup.GET("/register", registerHandle)
userGroup.GET("/login", loginHandle)
userGroup.GET("/info", infoHandle)
}
3、Gin渲染
(1)各种数据格式响应
1.JSON响应
r.GET("/someJSON", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "someJSON", "status": 200})
})
2. 结构体响应
r.GET("/someStruct", func(c *gin.Context) {
var msg struct {
Name string
Message string
Number int
}
msg.Name = "root"
msg.Message = "message"
msg.Number = 123
c.JSON(200, msg)
})
3.XML
r.GET("/someXML", func(c *gin.Context) {
c.XML(200, gin.H{"message": "abc"})
})
4.YAML响应
r.GET("/someYAML", func(c *gin.Context) {
c.YAML(200, gin.H{"name": "zhangsan"})
})
(2)HTML模版渲染
gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换,LoadHTMLGlob()方法可以加载模板文件。
r.LoadHTMLGlob("tem/*")
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", gin.H{"title": "我是测试", "ce": "123456"})
})
(3)重定向
r.GET("/index", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})