将 Golang 中的 http.Header 转化为数组

5

我正在发送POST请求:

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

我收到的是类型为http.Header的格式化后的resp.Header

我需要像这样做:

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

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


3
你可能会发现这个有用:https://golang.org/pkg/net/http/#Header - squiguy
4个回答

9

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)
}

resp.Header()[..] is not going to work. Header is a non-function, what you're looking for is resp.Header.Get("whatever") - TheLebDev

8

You could use a function like this one:

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
}

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

1

这个解决方案适用于 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()方法将返回一个空字符串。

0

您可以使用resp.Header().Get()来获取响应头的第一个值,如果该头键没有任何值,则返回""

因此,在您的情况下

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接