在我的情況下,需要捕獲請求并檢查是否是內部請求。如果不是,則將這些請求重定向到其他處理函式。
網址示例:
1. URL: http://localhost/internal/dosomething1
2. URL: http://localhost/internal/dosomething2/:id
3. URL: http://localhost/overview
4. URL: http://localhost/xxx
只有以開頭的 URIinternal應該在我自己的句柄函式中處理(案例 1 和 2)。
具有任何請求方法的其他人將代理到另一個函式(案例 3 和 4)。
我正在嘗試這樣使用router.Any("/*uri", handlerExternal):
func handlerExternal(c *gin.Context) {
path := c.Param("uri")
if strings.HasPrefix(path, "/internal/") {
uri := strings.Split(path, "/")
switch uri[2] {
case "dosomething1":
doInternal(c)
}
} else {
doExternal(c)
}
}
但是使用此解決方案,doInternal(c)無法捕獲路徑引數,:id如http://localhost/internal/dosomething2/:id
這種情況有更好的解決方案嗎?
uj5u.com熱心網友回復:
使用子引擎。
gin.New您可以僅使用內部路由實體化引擎而不運行它。相反,您將背景關系從您的Any路線傳遞到Engine.HandleContext.
這將從主引擎傳遞背景關系,并將根據子路由中的占位符匹配路徑引數。
您可以像往常一樣在子引擎上宣告路由:
func main() {
internalEngine := gin.New()
internalEngine.GET("/internal/dosomething1", func(c *gin.Context) { c.JSON(200, "ok") })
internalEngine.GET("/internal/dosomething2/:id", func(c *gin.Context) { c.JSON(200, c.Param("id")) })
mainEngine := gin.New()
mainEngine.Any("/*uri", func(c *gin.Context) {
path := c.Param("uri")
if strings.HasPrefix(path, "/internal/") {
uri := strings.Split(path, "/")
switch uri[2] {
case "dosomething1", "dosomething2":
internalEngine.HandleContext(c)
}
} else {
doExternal(c)
}
})
mainEngine.Run(":8800")
}
您還可以c.Request.URL.Path在將背景關系中繼到子引擎之前進行修改,例如internal,如果您愿意,可以洗掉前綴。
現在,如果您嘗試 GET 請求:
http://localhost:8855/internal/dosomething2/1234
它將回顯輸出:
"1234"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/427690.html
