为了账号安全,请及时绑定邮箱和手机立即绑定

Google App Engine 将 content-type 更改为 text/html

Google App Engine 将 content-type 更改为 text/html

Go
暮色呼如 2021-11-22 19:44:20
之前已经问过这个问题,但该答案适用于 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 中的任何使用。


查看完整回答
反对 回复 2021-11-22
?
holdtom

TA贡献1805条经验 获得超10个赞

查看来自http/header 的信息

WriteHeader 发送带有状态代码的 HTTP 响应标头。如果未显式调用 WriteHeader,则首次调用 Write 将触发隐式 WriteHeader(http.StatusOK)。因此显式调用 WriteHeader 主要用于发送错误代码。

首先尝试设置标题然后发送它


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信