写在前面
简单来说,Gin是一个用Go编写的HTTP Web框架。在使用golang编写后端时,它可以用类似于调用函数的形式来帮助我们与前端客户端沟通。如果感觉本文章有帮助,请记得点赞!
相关基础知识
Gin是一个用Golang编写的Web框架, 是一个基于Radix树的路由,小内存占用,没有反射,可预测的API框架,速度挺高了近40倍,支持中间件、路由组处理、JSON等多方式验证、内置了JSON、XML、HTML等渲染。是一个易于使用的API框架。
其中,我们常常用到gin.Engine。gin.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实例,New和Default方法,两者的区别是Default方法在调用New的基础上增加了使用Logger和 Recovery自带中间件的处理。如果需要自己手写这两个中间件可以在调用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)
}
}