此问题已被问及before,但该答案适用于python应用程序。我想知道如何解决go应用程序的问题。
我已在Google App Engine上部署了一项由移动客户端使用的网络服务。使用下面的函数,我将响应发送为XML或JSON(根据客户端的要求)
func (api *API) Respond(w http.ResponseWriter, r *http.Request, body interface{}, status int) {
var contentType string
var content []byte
var err error
if r.Header.Get("Accept") == "application/xml" {
contentType = "application/xml; charset=UTF-8"
content, err = xml.Marshal(body)
} else {
contentType = "application/json; charset=UTF-8"
content, err = json.MarshalIndent(body, "", " ")
}
if err != nil {
panic(err)
}
w.WriteHeader(status)
w.Header().Set("Content-Type", contentType)
w.Write(content)
}
但是,在任何一种情况下,客户端设备都会收到内容类型text/html
。我怎样才能解决这个问题?这是我的应用程序的app.yam文件:
application: wks-api
version: 3
runtime: go
api_version: go1
handlers:
- url: /.*
script: api
答案 0 :(得分:2)
查看https://golang.org/pkg/net/http/#ResponseWriter中的文档,我引用:
调用WriteHeader(或Write)后更改标题没有 效果
现在看看你的代码:
$a
NULL
$cc
[1] "dd"
$dd
[1] "ee"
$b
NULL
$ee
[1] "Yes"
$ff
[1] 1
如你所见,你确实是"在调用WriteHeader"之后更改标题。 - 因此,它没有效果"。
所以,你的"改变标题"改为之前:
w.WriteHeader(status)
w.Header().Set("Content-Type", contentType)
我认为这完全不适用于应用引擎 - 它应该适用于Go中w.Header().Set("Content-Type", contentType)
w.WriteHeader(status)
的任何使用。
答案 1 :(得分:0)
请参阅http/header的信息:
WriteHeader发送带有状态代码的HTTP响应头。如果 WriteHeader没有显式调用,第一次调用Write会 触发隐式WriteHeader(http.StatusOK)。因此显式调用 WriteHeader主要用于发送错误代码。
首先尝试设置标题然后发送