路由配置

Gin框架中处理HTTP请求首先要进行路由配置,这篇笔记我们学习如何配置路由。

路由匹配

Gin框架的路由设计的比较基础,只支持精确匹配方式,例如:

engine.GET("/api/v1/msg", func(context *gin.Context) {
    // ... 具体的处理方法
})

这种写法可以匹配GET /api/v1/msg或是GET /api/v1/msg/,而不会匹配GET /api/v1或是GET /api/v1/msg/aa

此外,对于Restful风格的API,Gin框架也支持路径参数,下面是一个例子:

engine.GET("/api/v1/student/:id", func(context *gin.Context) {
    // 获取路径参数
    s := context.Param("id")

    // ... 具体的处理方法
})

代码中,路径字符串里我们使用:id定义了一个路径参数,此时路由会匹配形如GET /api/v1/student/1的路径,但不会匹配GET /api/v1/student/1/aa或是GET /api/v1/student/

不过实际上,有时前缀匹配路由也是很常用的,比如我们需要匹配/storage开头的所有路径,包括形如/storage/image/1.jpg/storage/image/2020/1.jpg等,这种路由Gin没有直接支持,但可以通过Gin的中间件(Middleware)来实现,有关Middleware的内容将在后续介绍。

HTTP方法

Gin框架支持大部分HTTP方法,包括:GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH。不过我们一般只会用到前4种(Restful风格API),对应服务端资源的获取、创建、更新和删除。对于GET、POST、PUT、DELETE这几种HTTP方法,Gin框架的写法都是类似的。

engine.GET("/api/v1/student/:id", func(context *gin.Context) {
    // ... 具体的处理方法
})
engine.POST("/api/v1/student", func(context *gin.Context) {
    // ... 具体的处理方法
})
engine.PUT("/api/v1/student", func(context *gin.Context) {
    // ... 具体的处理方法
})
engine.DELETE("/api/v1/student/:id", func(context *gin.Context) {
    // ... 具体的处理方法
})

其实我个人认为在实际开发中,Restful风格的API也是难以遵循的,真正的业务逻辑基本只会用到GET和POST,前者用于返回一些静态资源,而JSON接口全部使用POST。

多个处理函数

Gin框架的处理函数是可以指定多个的,多个处理函数会形成处理函数链,按照指定顺序依次执行。

engine.GET("/api/v1/demo",
    func(context *gin.Context) {
        fmt.Println("处理函数1")
    },
    func(context *gin.Context) {
        fmt.Println("处理函数2")
    })

通过处理函数链,我们可以将一些复杂的业务逻辑拆分解耦,提高代码的可复用性。

路由分组

如果我们的接口路径都是形如:/api/v1/xxx,我们在每个路由匹配字符串中全都写一遍/api/v1还是比较麻烦的,Gin支持路由组的概念,一组路由可以具有相同的前缀。

v1 := engine.Group("/api/v1")
{
    v1.GET("/student/:id", func(context *gin.Context) {
        // ... 具体的处理方法
        fmt.Println(context.Param("id"))
    })
    v1.POST("/student", func(context *gin.Context) {
        // ... 具体的处理方法
    })
}

代码中,我们调用engine.Group()方法创建了路由组,然后基于路由组定义了具体的路由。这里实际上路由组上也可以指定一个或多个处理函数,它们会与具体路由上的处理函数组成处理函数链。

注意:代码中第2行的大括号表示开启了一个新的语句块作用域,这和C语言中的写法类似。

响应静态文件

Gin框架支持响应静态文件,下面是一个例子。

engine.Static("/", "d:\\workspace-go\\filedemo")

代码中,我们使用Static()方法配置了一个静态文件响应的路由,其中第1个参数是匹配的前缀路径,第2个参数是本地的文件路径。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap