Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.
В этой статье мы поговорим оGin
Фреймворк-маршрутизация (Router
)параметр,Gin
Настройки маршрутизации фреймворка очень просты, мы изучили их в предыдущих статьях.Gin
В рамочной статье будет виден почти каждый примерGin
Определение маршрута среды Gin заключается в получении информации о пользователе путем определения маршрута и обработки обработчика, соответствующего маршруту.Web
просить.
HttpRouter
Маршрутизация фреймворка Gin фактически использует стороннийHttpRouter
библиотека,HttpRouter
это легкий высокопроизводительныйHTTP
Запрос маршрутизатора (路由多路复用器
), Легче понять,HttpRouter
является лучшей реализацией ServeMux в пакете net/http Go из-заGin
Рамки принимаютHttpRouter
, поэтому производительность значительно улучшилась.
Вы можете установить в свой локальный GOPATH с помощью следующей командыHttpRouter
:
go get -u github.com/julienschmidt/httprouter
Маршрутизация и маршрутизация пакетов
1. Поддерживаются методы HTTP
Маршруты определены для обработки HTTP-запросов, а HTTP-запросы содержат различные методы, в том числеGET
,POST
,PUT
,PATCH
,OPTIONS
,HEAD
,DELETE
Семь методов и т. д. В структуре Gin есть соответствующие методы для определения маршрутов.
router := gin.New()
router.GET("/testGet",func(c *gin.Context){
//处理逻辑
})
router.POST("/testPost",func(c *gin.Context){
//处理逻辑
})
router.PUT("/testPut",func(c *gin.Context){
//处理逻辑
})
router.DELETE("/testDelete",func(c *gin.Context){
//处理逻辑
})
router.PATCH("/testPatch",func(c *gin.Context){
//处理逻辑
})
router.OPTIONS("/testOptions",func(c *gin.Context){
//处理逻辑
})
router.OPTIONS("/testHead",func(c *gin.Context){
//处理逻辑
})
Маршрут, созданный соответствующим методом выше, может обрабатывать только соответствующий метод запроса.Если маршрут, определенный GET, не может обработать запрос POST, мы можем передатьAny()
Методы определяют маршруты, которые могут обрабатывать любой запрос.
//可以处理GET,POST等各种请求
router.Any("/testAny",func(c *gin.Context){
//处理逻辑
})
Помимо вышеперечисленных простых способов, вы также можете использоватьHandle()
Создайте маршрут, указавHandle()
Первый параметр функции, определяющий, какой запрос обрабатывать:
//定义处理POST请求的方法
router.Handle("POST","/testHandlePost",func(c *gin.Context){
})
//定义处理GET请求的方法
router.Handle("GET","/testHandleGet",func(c *gin.Context){
})
2. Маршрут запроса
При определении маршрута вам необходимо определить путь запроса маршрута.В среде Gin с помощью нескольких поддерживаемых методов запроса вы можете легко реализовать путь запроса API в стиле Restful.
В предыдущих примерах используются прямые сопоставления путей маршрутизации, например следующий код, который может сопоставлять путь запроса только какtest
запрос.
router.GET("test",func(c *gin.Context){
})
Помимо прямого сопоставления путей, среда Gin также поддерживает использование подстановочных знаков двоеточия (:) и звездочек (*) для сопоставления путей запроса, например:
Используйте двоеточие (:) для определения путей маршрутизации:
router.GET("user/:name",func(c *gin.Context){
})
Приведенный выше путь запроса, результат запроса соответствует следующему:
/user/gordon 匹配
/user/you 匹配
/user/gordon/profile 不匹配
/user/ 不匹配
Используйте звездочку (*), чтобы указать путь запроса маршрута:
router.GET("user/*name",func(c *gin.Context){
})
Приведенный выше путь запроса, результат запроса соответствует следующему:
/user/gordon 匹配
/user/you 匹配
/user/gordon/profile 匹配
/user/ 匹配
3. Маршрутизация пакетов
В предыдущем примере, когда мы передавалиgin.New()
илиgin.Default()
создание методаgin.Engine
экземпляр структуры, вы можете быть использованы в этом примереGET
,POST
,PUT
,PATCH
,OPTIONS
,HEAD
,DELETE
и другие методы для определения маршрута, обрабатывающего запрос, в то время как на самом делеgin.Engine
Функция маршрутизации выполняется путем объединенияgin.RouterGroup
добиться, из следующегоgin.Engine
Код можно посмотреть.
Получение полей и методов других типов данных путем комбинирования — это воплощение объектно-ориентированного кодирования в языке Go.
gin.Engine
Определение:
type Engine struct {
RouterGroup //组合gin.RouterGroup
//省略其他字段
}
непосредственно черезgin.New()
илиgin.Default()
метод созданgin.Engine
объект для создания маршрутов, фактические маршруты не входят в группу маршрутизации, но на самом деле эти маршруты могут быть根路由分组
под.
Можно понять, что все маршруты, определенные в Gin, находятся в корневой группе маршрутизации.
gin.RouterGroup
Определение:
type RouterGroup struct {
Handlers HandlersChain
// contains filtered or unexported fields
}
определить группировку маршрутизации
использоватьgin.RouterGroup
изGroup()
Методы могут определять группы маршрутизации следующим образом:
Обратите внимание, что фигурные скобки используются ниже
{}
Объединение маршрутов в группу просто для большей интуитивности и в этом нет необходимости.
router := gin.New()
user := router.Group("user")
{
user.GET("profile",func(c *gin.Context)(){
//处理逻辑
})
user.POST("modify-password",func(c *gin.Context)(){
//处理逻辑
})
}
Используйте промежуточное ПО в маршрутизации
мы в"Go Web Lightweight Framework Gin Learning Series: подробное использование промежуточного программного обеспечения"Эта статья говорила о том, как использовать промежуточное программное обеспечение на маршруте, следующее для более полного понимания.
1. Метод Use(): глобальное промежуточное ПО
Метод Use() определяется следующим образом:
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes
образец кода
router := gin.New()
router.Use(gin.Loggter())//全局中间件
зачем проходитьgin.Engine
Является ли промежуточное ПО вызова Use() в возвращаемой структуре глобальным промежуточным ПО? Причина в том, что все пакеты маршрутизации находятся в根路由分组
под.
2. Используйте промежуточное программное обеспечение в группировке
router := gin.New()
user := router.Group("user",gin.Logger())//通过Group第二个参数,使用中间件
{
user.GET("profile",func(c *gin.Context)(){
//处理逻辑
})
user.POST("modify-password",func(c *gin.Context)(){
//处理逻辑
})
}
Промежуточное ПО также можно применять к группам маршрутов с помощью метода Use в возвращенной RouterGroup:
user := router.Group("user",gin.Logger()).Use(gin.Recovery())
3. Используйте промежуточное ПО на одном маршруте
Следующий код демонстрирует использование промежуточного программного обеспечения в одном определении маршрута:
router := gin.New()
router.GET("profile",gin.Logger(),gin.Recovery(),func(c *gin.Context)(){
//处理逻辑
})
Или после таких методов, как GET, используйте метод Use() для применения промежуточного программного обеспечения для маршрута:
router.GET("profile",func(c *gin.Context)(){
//处理逻辑
}).Use(gin.Logger(),gin.Recovery())
резюме
сторонняя библиотекаHttpRouter
Определяет свой собственный встроенный мультиплексор маршрутизации (mux
), составить язык Gonet/http
Недостаточность встроенного мультиплексора маршрутизации в пакете, а маршрутизация во фреймворке Gin находится вHttpRouter
Инкапсуляция поверх библиотеки проще в использовании: мы можем определить единый маршрут для получения пользовательских запросов или можем сгруппировать маршруты, что упрощает управление и легкое применение промежуточного программного обеспечения для унифицированной обработки перехвата.
Ваше внимание — самое большое поощрение на моем писательском пути!