Golang将http.Header转换为数组

时间:2016-02-29 23:23:47

标签: go

我发送POST请求:

req, err := http.NewRequest("POST", link, bytes.NewBuffer(jsonStr))
client := &http.Client{Timeout: tm}
resp, err := client.Do(req)

我收到resp.Header

类格式的http.Header

我需要这样的事情:

[
    "Server: nginx/1.4.4",
    "Date: Wed, 24 Feb 2016 19:09:49 GMT"
]

我不知道如何解决这个问题,因为我不知道如何处理http.Header数据类型。有人可以帮忙吗

4 个答案:

答案 0 :(得分:6)

resp.Header的类型为http.Header。您可以在文档中看到此类型也是map,因此您可以通过两种不同的方式访问它:

1)使用http.Header的方法:

serverValue := resp.Header().Get("Server")
dataValue := resp.Header().Get("Date")

如果标题存在,您将获得其第一个值(请记住,单个标题名称可能有多个值);否则你会得到一个空字符串。

2)使用map的方法:

serverValue, ok := resp.Header()["Server"]
dataValue, ok := resp.Header()["Date"]

如果标头存在,ok将为true(即标题存在),您将获得一个包含该标头所有值的字符串片段;否则,ok将为false(即标题不存在)。

使用您喜欢的任何方法。

如果需要迭代所有标头值,可以使用以下内容进行迭代:

for name, value := range resp.Header() {
    fmt.Printf("%v: %v\n", name, value)
}

答案 1 :(得分:4)

你可以使用像这样的函数:

func HeaderToArray(header http.Header) (res []string) {
    for name, values := range header {
        for _, value := range values {
            res = append(res, fmt.Sprintf("%s: %s", name, value))
        }
    }
    return
}

它应该返回一个你想要的数组。

答案 2 :(得分:0)

您可以使用resp.Header().Get()检索响应标头的第一个值,如果标头键没有值,则返回""

因此,在你的情况下

var a [2]string
a[0] = resp.Header().Get("server")
a[1] = resp.Header().Get("date")

答案 3 :(得分:0)

此解决方案适用于go version go1.13 windows/amd64

来自http.Request的请求对象包含Header对象。我们在这里使用net/http包。您可以使用以下方法按名称获取所有标头的值:

import(
    "net/http"
)

type RequestHeaders struct {
    ContentType      string      `json: "content-type"`
    Authorization    string      `json: "authorization"`
}

func getHeaders(r *http.Request) RequestHeaders {
        contentType := r.Header.Get("Content-Type")
        authorization := r.Header.Get("Authorization")
        headers := RequestHeaders{
                        Content-Type: contentType,
                        Authorization: authorization}
        return headers
}

您可以看到我们正在使用r.Header.Get("Content-Type")方法来获取标头的值。

如果标头丢失,则Get()方法将返回空字符串。