亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在使用 router.Any 和通配符處理請求后保留路徑參數

如何在使用 router.Any 和通配符處理請求后保留路徑參數

Go
qq_笑_17 2022-11-08 15:51:06
在我的情況下,需要捕獲請求并檢查是否是內部請求。如果不是,則將這些請求重定向到其他處理函數。網址示例:1. URL: http://localhost/internal/dosomething12. URL: http://localhost/internal/dosomething2/:id3. URL: http://localhost/overview4. 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這種情況有更好的解決方案嗎?
查看完整描述

1 回答

?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

使用子引擎。

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"


查看完整回答
反對 回復 2022-11-08
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號