Go Web Lightweight Framework Джин-обучение Серия обучения: маршрутизация группировки

Go

Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.

В этой статье мы поговорим о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Инкапсуляция поверх библиотеки проще в использовании: мы можем определить единый маршрут для получения пользовательских запросов или можем сгруппировать маршруты, что упрощает управление и легкое применение промежуточного программного обеспечения для унифицированной обработки перехвата.


Ваше внимание — самое большое поощрение на моем писательском пути!