卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35706本站已运行399

golang 请求重定向问题(多余的错误)

golang 请求重定向问题(多余的错误)

在使用golang进行网络请求时,偶尔会遇到请求重定向的问题。这个问题可能是由于多余的错误导致的。php小编西瓜为你解答如何解决这个问题,以确保网络请求的顺利进行。让我们一起来看看吧!

问题内容

我从 golang 中得到了一个非常奇怪的行为。

我想用发布请求做一些事情,然后重定向请求。 取决于随机因素......它是否有效。

当它不起作用时,我收到该错误:

“http:多余的响应。来自...的WriteHeader调用”

函数越深,重定向起作用的可能性就越小。

  • 据我所知,我只重定向一次(或零次......)
  • 在重定向之前我不会写入标头。
  • 在重定向之前我对 writer 所做的唯一一件事就是将其放入地图中。

我不想在这里复制所有代码,所以我会总结一下。

处理程序处理 POST 请求,在名为 demand 的映射中传递请求数据。

然后解析请求以获取表单值,并将其保存到 demand 中 它被发送到通道中。

需求图从通道传递到以下函数:

func answer_login(demand map[string]any) map[string]any {
    writer := demand["writer"].(http.ResponseWriter)
    request := demand["request"].(*http.Request)
    http.Redirect(writer, request, "/", 302) // <- if it is here it works (at95 %)
    // some mundane code (printing stuff, really)
    .
    .
    .
    // http.Redirect(writer, request, "/", 302) // <- if it is here it works (only at 20 %)
    ...

如果我按下 F5,它最终会正确重定向。 我尝试简单地在 writer.Write([]byte("same issues")) 中写入一些内容,同样的问题。

我在 Linux 上,尝试了不同的浏览器。

问题:这是一个(已知)错误吗?

有什么解决办法吗?

(强制写入客户端)

谢谢

解决方法

我终于了解了这个问题并找到了解决方案。
问题:

因此,编写器请求在与实际处理函数不同作用域的函数中进行处理和重定向。 以及当实际处理函数结束时。某些上下文因素使编写者请求过期:您无法再重定向或响应该请求。 这是在文档中写的:

https://pkg.go.dev/net/http p>

关于它有时起作用的一个可能的解释是......也许“通道传输、处理和重定向”发生得足够快(有时)并且实际处理程序功能尚未关闭。

在处理数据之前阻止处理程序函数会破坏并行异步处理的目的。 所以我最终将所有内容都嵌套在处理程序函数中。
欢迎聪明的人纠正我或分享关于上下文和 ResponseWriters 的更好的解释。

卓越飞翔博客
上一篇: 如何在 Gorm 中使用 Raw() 进行 Preload() ?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏