GO语言web框架Gin之完全指南(一)

本文是Gin框架的完全指南,详细介绍了Gin的优势,如高性能、中间件支持和错误管理。文章涵盖了从安装到使用的基本步骤,包括GET/POST请求、模型绑定、中间件的应用及单元测试。同时,探讨了Gin的运行模式,并提供了一些实用的开源中间件资源。
摘要由CSDN通过智能技术生成


作为一款企业级生产力的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) {
   
 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值