首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在中间件go-chi中获取url param

如何在中间件go-chi中获取url param
EN

Stack Overflow用户
提问于 2021-12-29 07:27:05
回答 1查看 3.4K关注 0票数 0

对于特定的路由集,我使用特定的中间件。

代码语言:javascript
复制
r.Route("/platform", func(r chi.Router) {
    r.Use(authService.AuthMiddleware)
    r.Get("/{id}/latest", RequestPlatformVersion)
})

现在,我如何访问这个id中间件内部的AuthMiddleware url参数?

代码语言:javascript
复制
func (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 param打印为空字符串,即使中间件正在运行,并且正在调用特定的路由。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-29 07:44:47

您将您的chi.URLParam放在path param {id}之前,并且忘记将.ServeHTTP(w, r)放在中间件中。如果你不放那个东西,你的请求就不会进入路线内的路径。

这就是工作的例子:

代码语言:javascript
复制
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

产出如下:

代码语言:javascript
复制
1
here  1

更新

在代码之后运行验证是不好的,您必须修复定义路径的方式,并在验证之后移动.ServeHTTP

这是一个例子:

代码语言:javascript
复制
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)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70516345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档