Golang使用Gin框架实现路由分类处理请求流程详解
作者:富士康质检员张全蛋 时间:2024-05-29 22:07:41
在前面已经学习了gin框架如何处理请求,解析请求,返回数据。
在实际的项目当中,项目往往是以模块化来进行划分和开发的,所谓的模块化就是按照功能来划分,比如会有产品模块,会有用户模块,会将用户相关的进行统一的开发,放到用户模块当中,和产品相关的放在产品相关的模块当中,这样即方便开发者进行统一的开发也方便在系统的维护过程当中方便维护。
背景
在实际的项目开发中,均是模块化开发。同一模块内的功能接口,往往会有相同的接口前缀。比如如下所示:
例如在系统中有用户模块,用户有不同注册、登录、用户信息
比如注册是register接口,它属于是用户模块,因此会在register前面有一个字段,这个字段表示的是用户模块是user模块,第二级的url register才表示用户模块 * 册的功能。
第一级是用户的模块,第二级代表该模块下面的什么功能。删除是删除用户的id。
注册:http://Localhost:9000/user/register
登录:http://localhost:9000/user/login
用户信息:http://localhost:9000/user/info
删除: http://localhost:9080/user/1001
类似这种接口前缀统一,均属于相同模块的功能接口。可以使用路由组进行分类处理。
可以看到不同的接口是按照两级的分类来定义的。
类似这种接口前缀统一,均属于相同模块的功能接口。可以使用路由组进行分类处理。
Group
所谓的路由组就是这些接口的前缀第一级都是以user开头,表示都是属于同一个模块,既然都是属于同一个模块,那么能不能对其进行统一的处理呢?当然可以,可以使用group进行划分,就是路由组。
group方法默认有两个参数,第一个参数是分组的url是分组的第一级,也就是模块名称。第二个参数是可变类型的参数,这里可以不需要填。
func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup
这里返回的是结构体指针类型*RouterGroup,这个结构体类型其实就是路由组的意思。在这个路由组当中,实现了很多的方法,这些方法都是这个接口里面的。
type IRoutes interface {
Use(...HandlerFunc) IRoutes
Handle(string, string, ...HandlerFunc) IRoutes
Any(string, ...HandlerFunc) IRoutes
GET(string, ...HandlerFunc) IRoutes
POST(string, ...HandlerFunc) IRoutes
DELETE(string, ...HandlerFunc) IRoutes
PATCH(string, ...HandlerFunc) IRoutes
PUT(string, ...HandlerFunc) IRoutes
OPTIONS(string, ...HandlerFunc) IRoutes
HEAD(string, ...HandlerFunc) IRoutes
StaticFile(string, string) IRoutes
StaticFileFS(string, string, http.FileSystem) IRoutes
Static(string, string) IRoutes
StaticFS(string, http.FileSystem) IRoutes
}
gin框架中可以使用路由组来实现对路由的分类。路由组是router.Group中的一个方法,用于对请求进行分组。如下案例所示:
register和login info都是对应着不同的请求类型。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
routeGroup := engine.Group("/user")
routeGroup.POST("/register", func(c *gin.Context) {
fullPath := "用户注册" + c.FullPath()
fmt.Println(fullPath)
c.Writer.WriteString(fullPath)
})
engine.Run()
}
在多路由的分组处理,可以使用engine.Group去处理我们的请求,方便按照我们的请求进行分类,然后也方便我们进行开发。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
routeGroup := engine.Group("/user")
routeGroup.POST("/register",registerHandler)
routeGroup.POST("/login", loginHandler)
routeGroup.DELETE("/:id", deleteHandler)
engine.Run()
}
func registerHandler(c *gin.Context) {
fullPath := "用户注册" + c.FullPath()
fmt.Println(fullPath)
c.Writer.WriteString(fullPath)
}
func loginHandler(c *gin.Context) {
fullPath := "用户登入" + c.FullPath()
fmt.Println(fullPath)
c.Writer.WriteString(fullPath)
}
func deleteHandler(c *gin.Context) {
fullPath := "用户删除" + c.FullPath()
userID := c.Param("id")
fmt.Println(fullPath)
c.Writer.WriteString(fullPath + " userID:" + userID)
}
在实际的过程当中设计到多模块的开发那么就可以使用路由分组的功能,会大大的提高开发效率。提高代码的可读性。
来源:https://blog.csdn.net/qq_34556414/article/details/130593811