我有一个带有前缀/api/a
的子路由器,并且我想在调用一个函数(设置上下文)后将所有带有前缀api/b/{aid}
的端点的请求重定向到api/a
。如何实现此目的?
当调用/api/a/<whatever>
时,我从cookie中获取帮助并添加到请求上下文中,但是在其他端点中cookie不包含aid
参数,因此我将其作为路由参数。我想要的是对/api/b/{aid}/<whatever>
的任何调用在我在请求上下文中设置/api/a/<whatever>
后(从路由参数中)重定向到aid
。
/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
/api/a/<remaining path>
并将其设置为request.URL
,并使用router.Match
在/api/a
子树/api/a/<remaining path>
的处理程序关于go - 调用函数后重定向到另一个端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60499397/