如何在运行AppEngine的Go服务器生成的响应中设置HTTP头?

时间:2014-04-03 18:18:09

标签: google-app-engine go

我正在尝试使用golang和google应用引擎设置标头。这是琐碎代码的样子:

w.Header().Set("Content-Type", "application/xml")
w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("header-name", "value")

它似乎无法在我的开发服务器上运行。我总是得到通常的标题和

content-type:text/plain; charset=utf-8

当我部署时,我得到了

Content-Type:text/html; charset=utf-8

我做错了还是这是一个错误(另一个)?

3 个答案:

答案 0 :(得分:4)

似乎问题是我在自定义标头之前设置了http代码。请注意,如果您在w.WriteHeader(200)之前w.Header,则不会设置标题。

答案 1 :(得分:0)

这绝对是GAE SDK的一个错误。在dev和prod环境之间观察到不合理的不同行为。我遇到了同样的问题,我按照特定的顺序设置标题 - 在dev上工作但在prod标题中没有设置。

在开发环境中,这会使您设置的标题正确返回:

func SignalingHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        http.NotFound(w, r)
        return
    }

    data := "test"

    w.Write([]byte(data))

    w.Header().Set("Content-Type", "application/json")
    w.Header().Add("Access-Control-Allow-Origin", "*")

}

然而,在prod环境中,我必须颠倒顺序 - 并使用"写"方法仅在设置标题后(否则它不会起作用):

 func SignalingHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        http.NotFound(w, r)
        return
    }

    data := "test"


    w.Header().Set("Content-Type", "application/json")
    w.Header().Add("Access-Control-Allow-Origin", "*")

    w.Write([]byte(data))
}

为了使产品在prod中工作,请确保在设置任何标题后不使用write方法。

答案 2 :(得分:0)

没有剩下的代码很难预测。但是,根本原因可能是您在设置标题之前已经写过响应。

这样的事情:

w.Write([]byte(data))

或类似的东西:

fmt.Printf(w, "A test response")