即使将内容类型设置为application / xml

时间:2015-11-27 08:12:25

标签: google-app-engine go

此问题已被问及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

2 个答案:

答案 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主要用于发送错误代码。

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