文章目录
作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素。截止目前为止,github上面已经有了 35,994 star. 一个开源框架,关注数越多,就会越可靠,因为大家会在使用当中不断地对它进行改进。
下面放几个链接方便进行查看:
几个流行的go框架进行比较
go几大web框架比较 这个主页对几大web框架进行了一些比较,主要是统计了github star
last commit time
等等信息,可以作为一个参考。
几大优势
- 速度快: 高性能,无反射代码,低内存消耗
- 中间件(拦截器): 可以更优雅的实现请求链路上下文的控制,比如日志,身份验证等等
- Crash保活: 当一个请求挂掉之后,并不影响服务器的稳定运行
- 数据验证
- 分组的API管理: 当需要给特定请求加验证,一些请求又不需要的时候,可以很方便的实现
- 错误管理
- 简单易用而丰富的类型支持: Json, Xml, Html 等等
简单的使用
引入项目
现在有方便的go mod支持,引入变得非常简单,直接在需要使用的代码文件处 import "github.com/gin-gonic/gin"
即可
gin的HelloWorld
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() // listen and serve on 0.0.0.0:8080
}
使用如上代码,便可轻松启动一个监听所有请求,端口为8080(默认)
的服务了。可以尝试用 curl
进行测试:
$ curl localhost:8080/ping
output: {"message":"pong"}
如果想监听在其它端口,可以进行修改 r.Run("0.0.0.0:9000")
Get 请求以及参数获取
现在要发起一个请求: curl 'localhost:8080/send?a=1&b=2'
,现在来看看我们如何通过 *gin.Context
拿到传参呢,这里我们省去一些代码
g.GET("/send", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"a": ctx.Query("a")
"b": ctx.Query("b"),
})
})
// output: {"a":"1","b":"2"}
我们把拿到的参数又返回给了客户端
假如前端此时需要传一个数组
到服务器,通过GET
方式,这时候该怎么办呢,此时有三个办法
- 客户端
curl 'localhost:8080/send?a=1&a=2'
传递同样的 key, web 框架会当做数组处理
g.GET("/send", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
"a": ctx.QueryArray("a"),
})
})
// output: {"a":["1","2"]}
- 客户端
curl 'localhost:8080/send?a=["1", "2"]'
这里是使用json字符串
的形式传递数组,注意这里面包含了 url 不允许直接传输的字符,比如[
]
和"
等,需要进行url编码
, 可以在 UrlEncode编码/UrlDecode解码 - 站长工具 这里进行转换一下,转换后的结果如下:
curl 'localhost:8080/send?a=%5b%221%22%2c+%222%22%5d'
, gin 相关代码如下:
g.GET("/send", func(ctx *gin.Context) {
out := []string{
}
err := json.Unmarshal([]byte(ctx.Query("a")), &out)
if err != nil {
ctx.JSON(200, gin.H{
"error": err.Error(),
})
return
}
ctx.JSON(200, gin.H{
"a": out,
})
})
// output: {"a":["1","2"]}
- 第三种就是传递参数的时候,传递一个字符串,每个元素之间用
,
号等分割一下,在服务端取到该字符串之后,再利用strings.Split()
函数分割成数组即可,这里就不例举代码了。
NOTE: 如果 query 取的key不存在,会得到什么呢?答案是空字符串
,或者你也可以使用
func (c *Context) GetQuery(key string) (string, bool)
这个方法,可以返回一个 bool
用来判断是否存在
路径参数Path该如何获取
curl 'localhost:8080/send/1?b=2'
g.GET("/send/:id", func(ctx *gin.Context) {