Go 的 HTTP 处理程序中的多个 WriteHeader 调用
在一个具有 net/http 服务器的简单 Go 程序中,开发人员遇到“多重响应”尝试处理 HTTP 请求时出现“.WriteHeader 调用”错误。当程序合并 goroutine 来执行 HandleIndex 函数时,就会发生错误,尽管处理程序函数被设计为只编写一次标头并提供静态主体。
错误说明
负责处理传入请求的匿名函数打印 URL,在新的 goroutine 中启动 HandleIndex 函数,然后继续执行。当处理函数在首次调用 Write 之前省略设置响应状态时,Go 会自动将状态设置为 200 (HTTP OK)。此外,如果处理函数没有向响应写入任何内容(并且没有设置响应状态并正常完成),则这将被视为成功的请求处理,导致响应状态为 200。
在这种情况下,匿名函数不会设置响应状态,也不会将任何内容写入响应。因此,Go 将响应状态设置为 200 HTTP OK。由于每个请求都是在自己的 goroutine 中处理的,因此如果在新的 goroutine 中调用 HandleIndex,原来的匿名函数将继续执行,包括设置响应头。同时,新启动的goroutine也会设置response header,导致“多次response.WriteHeader requests”错误。
解决方案:删除Goroutine
通过消除“go”关键字,HandleIndex 将在与处理函数相同的 goroutine 中调用,确保在处理函数返回之前设置响应头。这可以防止“net/http”包再次尝试设置响应标头,从而解决错误。
以上是为什么使用 Goroutines 会导致 Go 的 HTTP 处理程序中出现'多次 response.WriteHeader 调用”?的详细内容。更多信息请关注PHP中文网其他相关文章!