为了账号安全,请及时绑定邮箱和手机立即绑定

如何在中间件 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 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号