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

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

如何在中間件 go-chi 中獲取 url 參數

如何在中間件 go-chi 中獲取 url 參數

Go
慕無忌1623718 2022-10-24 09:28:59
我為特定的路由集使用特定的中間件r.Route("/platform", func(r chi.Router) {    r.Use(authService.AuthMiddleware)    r.Get("/{id}/latest", RequestPlatformVersion)})現在我如何訪問這個中間件中id的 url 參數AuthMiddlewarefunc (s *Service) AuthMiddleware(h http.Handler) http.Handler {    fn := func(w http.ResponseWriter, r *http.Request) {        fmt.Println(chi.URLParam(r, "id"))        id := chi.URLParam(r, "id")                if id > 100 {          http.Error(w, errors.New("Error").Error(), http.StatusUnauthorized)          return        }    }    return http.HandlerFunc(fn)}但是,即使正在運行中間件并且正在調用特定路由,id 參數也會打印為空字符串
查看完整描述

1 回答

?
瀟瀟雨雨

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

你把你chi.URLParam的路徑參數放在前面{id},你忘了放在.ServeHTTP(w, r)中間件上。如果你不放那個東西,你的請求就不會進入路由內部的路徑。


這是工作示例:


package main


import (

    "fmt"

    "net/http"


    "github.com/go-chi/chi"

)


func AuthMiddleware(h http.Handler) http.Handler {

    fn := func(w http.ResponseWriter, r *http.Request) {

        fmt.Println(chi.URLParam(r, "id"))

        h.ServeHTTP(w, r)

    }

    return http.HandlerFunc(fn)

}


func main() {

    r := chi.NewRouter()


    r.Route("/platform/{id}", func(r chi.Router) {

        r.Use(AuthMiddleware)

        r.Get("/latest", func(rw http.ResponseWriter, r *http.Request) {

            fmt.Println("here ", chi.URLParam(r, "id")) // <- here

        })

    })


    http.ListenAndServe(":8080", r)

}

我將 移動{id}到platform/{id}以便中間件獲得id路徑值,并h.ServeHTTP(w, r)在中間件中添加。


嘗試訪問http://localhost:8080/platform/1/latest


輸出將是:


1

here  1

更新


在代碼之后運行驗證是不好的,你必須修復你定義路徑的方式,并.ServeHTTP在驗證之后移動。


這是一個例子:


package main


import (

    "errors"

    "fmt"

    "net/http"

    "strconv"


    "github.com/go-chi/chi"

)


func AuthMiddleware(h http.Handler) http.Handler {

    fn := func(w http.ResponseWriter, r *http.Request) {

        fmt.Printf("Middleware First, id: %+v\n", chi.URLParam(r, "id"))

        id, _ := strconv.Atoi(chi.URLParam(r, "id"))


        if id > 100 {

            http.Error(w, errors.New("Error").Error(), http.StatusUnauthorized)

            return

        }

        h.ServeHTTP(w, r)

    }

    return http.HandlerFunc(fn)

}


func main() {

    r := chi.NewRouter()


    // This works too ()

    // r.Route("/platform/{id}", func(r chi.Router) {

    //  r.Use(AuthMiddleware)

    //  r.Get("/latest", func(rw http.ResponseWriter, r *http.Request) {

    //      fmt.Println("second: ", chi.URLParam(r, "id")) // <- here

    //  })

    // })


    // Other Solution (Wrapping Middleware)

    r.Route("/platform", func(r chi.Router) {

        r.Get("/{id}/latest", AuthMiddleware(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {

            fmt.Println("second: ", chi.URLParam(r, "id")) // <- here

        })).ServeHTTP)

    })


    http.ListenAndServe(":8080", r)

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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