【问题标题】:Redirect to another endpoint after calling a function调用函数后重定向到另一个端点
【发布时间】:2020-03-03 15:32:37
【问题描述】:

我有一个前缀为/api/a 的子路由器,我想在调用一个函数(设置上下文)后将所有对前缀为api/b/{aid} 的端点的请求重定向到api/a。如何实现这一点?

当调用 /api/a/<whatever> 时,我从 cookie 中获取帮助并添加到请求上下文中,但还有其他端点,其中 cookie 不包含 aid 参数,因此我将其作为路由参数。我想要的是任何对/api/b/{aid}/<whatever> 的调用在我在其请求上下文(来自路由参数)中设置aid 之后重定向到/api/a/<whatever>

  1. 我绝对不想使用客户端重定向,他不需要知道。
  2. 我也知道我可以直接传递给任何带有 http.Handler 签名的函数。这正是我想要避免的。
  3. 有一组固定的端点不会设置 cookie(这是有意的,所以我不想设置一个),并且该组总是以 /api/b/{aid} 为前缀。

由于已经有 150 多个端点和处理程序配置到前缀为 /api/a 的子路由器(我们称之为 A)。还有另一个子路由器 B,前缀为 /api/b/{aid}。我想在调用函数后将对子路由器 B 的所有调用重定向到子路由器 A。如果我想要完全相同的东西,为单独的子路由器复制整个处理程序列表是不合逻辑的。

【问题讨论】:

    标签: go gorilla


    【解决方案1】:

    您不能在请求上下文中设置值,然后重定向到其他 URL 并期望获得该值。您必须使用查询参数或 cookie 等将该值作为重定向的一部分传递。或者您可以在没有重定向的情况下执行此操作,并直接调用重定向 URL 的处理程序。

    如果您想使用 cookie 执行此操作,您可以在处理程序中获取 aid,使用 http.SetCookie 设置包含 aid 的 cookie,并使用 http.Redirect 进行重定向。另一个处理程序应该收到 cookie。

    如果您想使用查询参数执行此操作,您可以使用添加的查询参数编写重定向 URL,使用 http.Redirect 重定向,然后在其他处理程序中解析它。

    如果您想在没有重定向的情况下执行此操作,您可以在一个处理程序中获取aid,将其放入请求上下文中,然后直接调用另一个处理程序:

    request.WithContext(context.WithValue(request.Context(),key,aid))
    otherHandler(writer,request)
    

    您可以使用 Router.Match 和单个处理程序自动转发给其他调用者:

    • 为路径前缀/api/b/{aid}/注册一个处理程序
    • 处理程序解析aid
    • Handler重写了一个url/api/a/<remaining path>,给它设置了request.URL,并使用router.Match/api/a子树下找到对应的路径
    • 处理程序调用/api/a/<remaining path> 的处理程序

    【讨论】:

    • 编辑了答案,并提出了如何使用单个处理程序的建议
    • 重写 URL 不会把它传给新的子路由器,它只保留在那里。
    • 你重写URL调用router.Match
    猜你喜欢
    • 2019-01-24
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多