go - 调用函数后重定向到另一个端点

标签 go gorilla

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

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

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

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

    最佳答案

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

    如果要使用Cookie进行此操作,则可以在处理程序中获取aid,使用aid设置包含http.SetCookie的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
  • 处理程序将重写url /api/a/<remaining path>并将其设置为request.URL,并使用router.Match/api/a子树
  • 下找到相应的路径。
  • 处理程序调用/api/a/<remaining path>的处理程序
  • 关于go - 调用函数后重定向到另一个端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60499397/

    相关文章:

    go - 如何阅读golang中的浮点符号?

    go - 为什么 Simple dialer(socks) 总是返回 EOF?

    go - 访问字符串的原始字节

    Golang : why runtime. GOMAXPROCS 限制为256?

    go - 无法在现有服务器上使用 go tool pprof

    go - negroni 中间件中设置的请求上下文在嵌套的 gorilla 子路由器中丢失

    Gorilla WebSocket 与 golang.org/x/net/websocket 相比

    mysql - 删除无效

    session - 想要在客户端发送新请求时获取 session 值

    Golang Gorilla Websocket 在 120 秒时停止接收信息