# gin框架
go的流行web框架有很多,每个都有自己的特色
Gin号称最快的go语言web框架,是目前官方推荐的框架,简洁,拓展稳定性能都比较出色
iris性能比gin好一些,支持MVC,但评价不太好,使用上问题比较多
beego,最早的go web框架之一,工具集比较完善,性能比较差
fiber,发展迅速建立在fasthttp上,性能目前最高,比较简洁上手比较快,类似gin
go的框架可以理解为库,并不是用了某一个框架就不能用别的框架,可以选择性的使用各个库中的优秀组件,进行组合
gin介绍
基于Radix树的理由,小内存占用没有反射。可预测的API性能
支持中间件
传入的http请求可以由一系列中间件和最终操作来处理
gin可以catch一个发生在HTTP请求中的panic并recover
Gin可以解析并验证请求的JSON
更好的组织路由,是否需要授权,不同的API版本….这些组合无线、、无限嵌套不会降低性能。
Gin提供了一种方便的方法来收集HTTP 请求期间发生的所有错误,最终,中间件可以将它们写入日志文件,数据库并通过网络发送
Gin为JSON,XML和HTML渲染提供了易于使用的API
新建一个中间件非常简单
快速入门
go get -u github.com/gin-gonic/gin
示例程序:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 }
简单的代码就实现了一个http的服务
路由
路由是URI到函数的映射
一个URI包含:
-
协议http/https
-
ip端口或者域名,比如127.0.0.1:8080或者www.test.com
-
path
-
query
同时访问时还要指明HTTP METHOD
GET
-
请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据
POST
-
将实体提交到指定的资源,通常会导致在服务器上的状态变化
HEAD
-
请求一个与GET请求的响应相同的响应,但是没有响应体
PUT
-
PUT方法用于请求有效载荷替换目标资源的所有当前表示
DELETE
-
DELETE方法删除指定资源
CONNECT
-
CONNECT方法建立一个到由目标资源标识的服务器的隧道
OPTIONS
-
OPTIONS方法用于描述目标资源的通信选项
TRACE
-
沿着目标资源的路径执行一个消息环回测试
PATCH
-
对资源应用部分修改
RESTfulAPI规范
RESTful API规范建议我们使用特定的HTTP方法来对服务器上的资源进行操作
-
GET,表示读取服务器上的资源
-
POST,表示在服务器上创建资源
-
PUT,表示更新或者替换服务器上的资源
-
DELETE,表示删除服务器上的资源
-
PATCH,表示更新/修改资源的一部分
请求方法
r.GET("/get",func(ctx *gin.Context) { ctx.JSON(200,"get") }) r.POST("/post",func(ctx *gin.Context) { ctx.JSON(200,"POST") })
如果想要支持所有:
r.Any("/any",func(ctx *gin.Context) { ctx.JSON (200,"any") })
URI
URI 书写的时候,我们不需要关心scheme和authority两部分,我们主要通过path和query两部分的书写来进行资源的定位
-
静态uri,比如/hello,/user/find
-
r.POST("/user/find",func(ctx *gin.Context)) { }
-
路径参数比如/user/find/id
-
r.POST("/user/find/:id", func(ctx *gin.Context) { param := ctx.Param("id") ctx.JSON(200, param) })
-
模糊匹配 /user/*path
-
r.POST("/user/*path", func(ctx *gin.Context) { param := ctx.Param("path") ctx.JSON(200, param) })
处理函数
type HandlerFunc func(*Context)
通过上下文参数,获取http的请求参数,响应http请求等
分组路由
进行开发的时候,我们要进行模块的划分,或进行多版本开发
ug := r.Group("/user") { ug.GET("find", func(ctx *gin.Context) { ctx.JSON(200, "user find") }) ug.POST("save", func(ctx *gin.Context) { ctx.JSON(200, "user save") }) } gg := r.Group("/goods") { gg.GET("find", func(ctx *gin.Context) { ctx.JSON(200, "goods find") }) gg.POST("save", func(ctx *gin.Context) { ctx.JSON(200, "goods save") }) }