Gin框架
基本安装
1.首先需要安装Go(需要1.10+版本),然后可以使用下面的Go命令安装Gin。
go get -u github.com/gin-gonic/gin
2.将其导入您的代码中:
import "github.com/gin-gonic/gin"
使用范例:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
// 1.创建路由
r := gin.Default()
// 2.绑定路由规则,执行的函数
// gin.Context,封装了request和response
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "hello World!")
})
// 3.监听端口,默认在8080
// Run("里面不指定端口号默认为8080")
r.Run(":8000")
}
复制代码
路由使用
路由的本质是前缀树,利用前缀树来实现路由的功能。建议使用postman来进行测试学习,省时省力
基本使用
路由路径的设置,遵循Restful风格(采用URL定位,HTTP描述操作):
// 设置路由
router := gin.Default()
// 第一个参数是:路径; 第二个参数是:具体操作 func(c *gin.Context)
router.GET("/Get", getting)
router.POST("/Post", posting)
router.PUT("/Put", putting)
router.DELETE("/Delete", deleting)
// 默认启动的是 8080端口
router.Run()
复制代码
路由分组
// 两个路由组,都可以访问,大括号是为了保证规范
v1 := r.Group("/v1")
{
// 通过 localhost:8080/v1/hello访问,以此类推
v1.GET("/hello", sayHello)
v1.GET("/world", sayWorld)
}
v2 := r.Group("/v2")
{
v2.GET("/hello", sayHello)
v2.GET("/world", sayWorld)
}
r.Run(":8080")
复制代码
大量路由实现
当我们的路由变得非常多的时候,那么建议遵循以下步骤:
- 建立
routers
包,将不同模块拆分到多个go文件
- 每个文件提供
一个方法
,该方法注册实现所有的路由 - 之后main方法在调用文件的方法实现注册
// 这里是routers包下某一个router对外开放的方法
func LoadRouter(e *gin.Engine) {
e.Group("v1")
{
v1.GET("/post", postHandler)
v1.GET("/get", getHandler)
}
...
}
复制代码
main文件实现:
func main() {
r := gin.Default()
// 调用该方法实现注册
routers.LoadRouter(r)
routers.LoadRouterXXX(r) // 代表还有多个
r.Run()
}
复制代码
规模如果继续扩大也有更好的处理方式(建议别太大,将服务拆分好):
项目规模更大的时候,我们可以遵循以下步骤:
- 建立
routers
包,内部划分模块(包),每个包有个router.go
文件,负责该模块的路由注册
├── routers
│ │
│ ├── say
│ │ ├── sayWorld.go
│ │ └── router.go
│ │
│ ├── hello
│ │ ├── helloWorld.go
│ │ └── router.go
│ │
│ └── setup_router.go
│
└── main.go
复制代码
- 建立
setup_router.go
文件,并编写以下方法:
type Register func(*gin.Engine)
func Init(routers ...Register) *gin.Engine {
// 注册路由
rs := append([]Register{}, routers...)
r := gin.New()
// 遍历调用方法
for _, register := range rs {
register(r)
}
return r
}
复制代码
- main.go中按如下方式写入需要注册的路由,可进行路由的初始化:
func main() {
// 设置需要加载的路由配置
r := routers.Init(
say.Routers,
hello.Routers, // 后面还可以有多个
)
r.Run(":8080")
}
复制代码
获取参数
路径参数
:
只能匹配1个,*
可以匹配任意个数
// 此规则能够匹配/user/xxx这种格式,但不能匹配/user/ 或 /user这种格式
router.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name&