第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在中間件 go-chi 中獲取 url 參數(shù)

如何在中間件 go-chi 中獲取 url 參數(shù)

Go
慕無(wú)忌1623718 2022-10-24 09:28:59
我為特定的路由集使用特定的中間件r.Route("/platform", func(r chi.Router) {    r.Use(authService.AuthMiddleware)    r.Get("/{id}/latest", RequestPlatformVersion)})現(xiàn)在我如何訪問(wèn)這個(gè)中間件中id的 url 參數(shù)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)}但是,即使正在運(yùn)行中間件并且正在調(diào)用特定路由,id 參數(shù)也會(huì)打印為空字符串
查看完整描述

1 回答

?
瀟瀟雨雨

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊

你把你chi.URLParam的路徑參數(shù)放在前面{id},你忘了放在.ServeHTTP(w, r)中間件上。如果你不放那個(gè)東西,你的請(qǐng)求就不會(huì)進(jìn)入路由內(nèi)部的路徑。


這是工作示例:


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)

}

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


嘗試訪問(wèn)http://localhost:8080/platform/1/latest


輸出將是:


1

here  1

更新


在代碼之后運(yùn)行驗(yàn)證是不好的,你必須修復(fù)你定義路徑的方式,并.ServeHTTP在驗(yàn)證之后移動(dòng)。


這是一個(gè)例子:


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)

}


查看完整回答
反對(duì) 回復(fù) 2022-10-24
  • 1 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)