将标头添加到 ResponseWriter

Posted

技术标签:

【中文标题】将标头添加到 ResponseWriter【英文标题】:Adding a header to a ResponseWriter 【发布时间】:2017-01-09 10:53:27 【问题描述】:

我正在尝试为this issue 提供修复,并尝试了类似于this 的方法,但是无论我尝试设置什么标头,我都没有在我尝试修改的http 响应中看到它.

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

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)
    

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

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

【问题讨论】:

显示请求处理程序的代码以及您添加调用以设置标头的位置。 我只是想:) ResponseWriter 在到达这个函数之前是否在其他任何地方修改过? 乍一看似乎是正确的。您确定要测试更新的代码吗? 耶!它终于奏效了!感谢w.WriteHeader(http.StatusOK) aacebedo 让我补充。如果您愿意,您可以通过回答来轻松获得互联网积分:) 【参考方案1】:

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

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

为了使它工作,所有的头都应该在 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)

【讨论】:

我遇到了同样的问题并发现了同样的解决方案,但不明白它为什么会起作用。是否有官方 go doc 的参考,解释了这种行为背后的原因?谢谢。 这和go无关,HTTP就是这样设计的。因为 HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成 - 因此它必须是响应正文之前的最后一个标头。请参阅w3.org/Protocols/rfc2616/rfc2616-sec6.html 了解更多信息

以上是关于将标头添加到 ResponseWriter的主要内容,如果未能解决你的问题,请参考以下文章

将 UIButton 添加到 UICollectionView 标头

如何将 HTTP 标头添加到 SOAP 客户端

如何将标头添加到 PySpark DataFrame?

将标头添加到 ResponseWriter

Guzzle HTTP - 将授权标头直接添加到请求中

骆驼如何将授权标头添加到休息路线?