返回顶部
首页 > 资讯 > 精选 >在go-chi中为子路由设置不同的中间件
  • 460
分享到

在go-chi中为子路由设置不同的中间件

go语言 2024-02-09 10:02:08 460人浏览 薄情痞子
摘要

在Go语言的WEB框架go-chi中,为子路由设置不同的中间件是一种常见的需求。中间件是一种处理Http请求和响应的函数,它可以在请求到达目标处理器之前和之后执行一些额外的操作。通过为

Go语言的WEB框架go-chi中,为子路由设置不同的中间件是一种常见的需求。中间件是一种处理Http请求和响应的函数,它可以在请求到达目标处理器之前和之后执行一些额外的操作。通过为不同的子路由设置不同的中间件,我们可以根据业务需求对每个子路由进行个性化的处理。在本文中,我们将介绍如何在go-chi中灵活地为子路由设置不同的中间件,以实现更加灵活的路由处理。

问题内容

我有一个可以通过配置停用的代理服务器,使用 mustBeSecure。我希望这个代理在某个子域中表现不同:“/application/health”,使其始终不安全。到目前为止我尝试过的所有更改都失败了。有没有办法为“/application/health”配置不同的组,该组仍然使用代理但从不需要身份验证?

router := chi.NewRouter()
router.Route("/", func(r chi.Router) {
    r.Use(chimw.Recoverer)
    router.Use(hlog.NewHandler(log.Logger))
    if mustBeSecure() {
        r.Use(keycloak.MustStandardKeycloakAuth("url"))
    }
    setProxy(r)
    r.Group(func(r chi.Router) {
        r.Get("/health", handleHealth())
    })
})
return http.ListenAndServe("0.0.0.0", router)

根据要求,这里是 setProxy() 的示例

func setProxy(r chi.Router) {
    r.Route("/application", func(r chi.Router) {
        r.Use(func(next http.Handler) http.Handler {
            return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                ctx := context.WithValue(r.Context(), "target", "http:locahost:9999")
                r = r.WithContext(ctx)
                next.ServeHTTP(w, r)
            })
        })
        r.HandleFunc("/*", httputil.ReverseProxy{}.ServeHTTP)
    })
}

解决方法

我相信你正在尝试这个。

  • 对所有 /application 路由使用路由器
  • 声明 GET /health
  • 为所有其他路由创建一个组(在 /application 中)
  • 应用条件中间件

为了便于理解,我稍微简化了代码。您仍然可以使用 setProxy 函数。

func main() {
    proxy, err := NewProxy("http://localhost:4422")
    if err != nil {
        panic(err)
    }

    router := chi.NewRouter()

    router.Get("/health", handleHealth)

    router.Route("/application", func(r chi.Router) {
        r.Get("/health", ProxyRequestHandler(proxy))

        r.Group(func(r chi.Router) {
            if mustBeSecure() {
                r.Use(keycloak.MustStandardKeycloakAuth("url"))
            }
            r.HandleFunc("/*", ProxyRequestHandler(proxy))
        })
    })

    http.ListenAndServe("0.0.0.0:4411", router)
}

func NewProxy(targetHost string) (*httputil.ReverseProxy, error) {
    targetUrl, err := url.Parse(targetHost)
    if err != nil {
        return nil, err
    }

    return httputil.NewSingleHostReverseProxy(targetUrl), nil
}

func ProxyRequestHandler(proxy *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    }
}

以上就是在go-chi中为子路由设置不同的中间件的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 在go-chi中为子路由设置不同的中间件

本文链接: https://lsjlt.com/news/562400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作