登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-10 09:27:35 192浏览 收藏

golang学习网今天将给大家带来《调用函数后重定向到另一个端点》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

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

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

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

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


解决方案


您无法在请求上下文中设置值,然后重定向到其他某个 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/,并为其设置 request.url,并使用 router.match 查找 /api/a 子树下对应的路径
  • 处理程序调用 /api/a/ 的处理程序

到这里,我们也就讲完了《调用函数后重定向到另一个端点》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>