向 ResponseWriter 添加标头

gre*_*ire 4 go

我正在尝试为此问题提供修复程序,并尝试了与此类似的方法,但是无论我尝试设置什么标头,我都没有在我尝试修改的 http 响应中看到它。

是我尝试更改的方法,这是我尝试添加的行:

w.Header().Set("Content-Type", "application/json").

完整方法:

func (s *HTTPServer) getServices(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    if err := json.NewEncoder(w).Encode(s.list.GetAllServices()); err != nil {
        log.Println("Error encoding: ", err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望标题会改变,但它总是 text/plain; charset=utf-8

免责声明:这是我在 Go 中编写(或者更确切地说,复制/粘贴/改编)的第一段代码。

Ita*_*der 7

如果有人遇到这个问题,下一个信息可能会有所帮助。

这不起作用的原因是在尝试添加内容类型标头之前写出状态代码。

要使其工作,应在调用 w.WriteHeader(status code) 之前添加所有标头。例子:

w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
encoder := json.NewEncoder(w)
encoder.SetEscapeHTML(false)
if err := encoder.Encode(s.list.GetAllServices()); err != nil {
    panic(err)
}
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的问题并发现了同样的解决方案,但不明白它为什么有效。是否有参考官方 go 文档,解释这种行为背后的原因?谢谢。 (2认同)