Gin的基础使用 | 青训营

192 阅读3分钟
写在前面

简单来说,Gin是一个用Go编写的HTTP Web框架。在使用golang编写后端时,它可以用类似于调用函数的形式来帮助我们与前端客户端沟通。如果感觉本文章有帮助,请记得点赞!

相关基础知识

Gin是一个用Golang编写的Web框架, 是一个基于Radix树的路由,小内存占用,没有反射,可预测的API框架,速度挺高了近40倍,支持中间件、路由组处理、JSON等多方式验证、内置了JSON、XML、HTML等渲染。是一个易于使用的API框架。
其中,我们常常用到gin.Enginegin.Engine是一个容器对象,为整个框架的基础;gin.RouterGroup负责存储所有的中间件,包括请求路径;gin.trees负责存储路由和handle方法的映射,采用的是Radix树的结构.

基础用法
  • 导入包
    import "github.com/gin-gonic/gin"
  • 创建路由,ginServer被称为Gin引擎实例
    ginServer := gin.Default()
  • 绑定路由规则,执行的函数
    ginServer.GET("/",func(context *gin.Context)) {
    context.String(http.StatusOK,"Hello World!")
    })
  • 监听端口,在端口8080上运行服务器 ginServer.Run(":8080")

Gin框架暴露了两个方法用来初始化Gin实例,NewDefault方法,两者的区别是Default方法在调用New的基础上增加了使用LoggerRecovery自带中间件的处理。如果需要自己手写这两个中间件可以在调用New的基础上,增加Use方法,用来注册中间件。 初始化Gin实例中主要实现了两个核心功能:初始化路由组RouterGroup和初始化pool主要用来存储context上下文对象,用来优化处理http请求时的性能

通过Context的Param方法来获取API参数
ginServer.GET("user/:name/*action",func(context *gin.Context) {
    name := context.Param("name")
    action := context.Param("action")
    fmt.Println(action)
    action = strings.Trim(action,"/")
    context.String(http.StatusOK, name + " is " + action)
})
  • ginServer.GET("user/:name/*action",func(context *gin.Context)
    定义了一个GET路由,使用了Gin的路由参数语法。user表示URL路径,:name表示一个命名参数,*action表示一个通配符参数
  • name := context.Param("name")
    action := context.Param("action")
    在路由处理函数中,使用context.Param()方法来获取所URL中所需要的参数值
  • strings.Trim(action,"/") 去除action头尾的斜杠
  • context.String()返回HTTP相应,显示name和处理后的action
通过Context的DefaultQuery()或Query()方法获取URL参数
ginServer.Get("user",func(context *gin.Context) {
    name := context.DefaultQuery("name","you")
    context.String(http.StatusOK,fmt.Sprintf("hello %s",name))
}) 
  • ginServer.Get("user",func(context *gin.Context) 定义一个GET路由,其中"user"是URL路径,表示当用户访问http://127.0.0.1/user时,将执行这个路由的处理函数
  • context.DefaultQuery("name","you") 该函数从URL的查询参数中获取名为"name"的参数值。如果"name"参数不存在,则使用默认值"you"
  • context.String(http.StatusOK,fmt.Sprintf("hello %s",name)) 返回HTTP响应,显示包含参数值的字符串
把路由拆分成单独的文件或包

在实际的编码中,经常把实现路由注册的相关逻辑单独拆分出来,形成一个单独的文件或包(当然也可以把路由注册分割成多个文件),从而方便分层管理与发现错误。以下面的例子来简单说明:

  • 先在routers.go的文件中,定义注册相关的路由信息
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func helloHandler(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello Gin",
    })
}

func setupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/user", helloHandler)
    return r
}
  • 然后在main.go文件中调用上面的setupRouter()函数
func main() {
    r := setupRouter()
    if err := r.Run(); err != nil {
        fmt.Println("startup service failed, err:%v\n", err)
    }
}