之前已经问过这个问题,但该答案适用于 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)}然而,在任何一种情况下,客户端设备都会收到一个 Content-Type text/html。我怎样才能解决这个问题?这是我的应用程序的 app.yam 文件:application: wks-apiversion: 3runtime: goapi_version: go1handlers:- url: /.* script: api
2 回答
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
查看https://golang.org/pkg/net/http/#ResponseWriter中的文档,我引用:
调用 WriteHeader(或 Write)后更改标头无效
现在看看你的代码:
w.WriteHeader(status) w.Header().Set("Content-Type", contentType)
你看,你是真的“以WriteHeader一个电话后更改标题” -因此,它“没有效果”。
因此,请在调用之前执行“更改标题” :
w.Header().Set("Content-Type", contentType) w.WriteHeader(status)
我认为这根本不是特定于应用程序引擎的——它应该适用http
于 Go 中的任何使用。
holdtom
TA贡献1805条经验 获得超10个赞
查看来自http/header 的信息:
WriteHeader 发送带有状态代码的 HTTP 响应标头。如果未显式调用 WriteHeader,则首次调用 Write 将触发隐式 WriteHeader(http.StatusOK)。因此显式调用 WriteHeader 主要用于发送错误代码。
首先尝试设置标题然后发送它
- 2 回答
- 0 关注
- 232 浏览
添加回答
举报
0/150
提交
取消