Thi*_*aja 3 parameters url middleware go go-chi
我对特定的路由集使用特定的中间件
r.Route("/platform", func(r chi.Router) {
    r.Use(authService.AuthMiddleware)
    r.Get("/{id}/latest", RequestPlatformVersion)
})
现在我如何访问这个中间件id中的 url 参数AuthMiddleware
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 参数也会打印为空字符串
您将您的路径放在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)
}
| 归档时间: | 
 | 
| 查看次数: | 13996 次 | 
| 最近记录: |