如何在golang中从http请求中读取标头?

时间:2017-09-03 07:49:01

标签: go

如果收到http.Request类型的请求,我该如何读取特定标题的值?在这种情况下,我想从请求标头中提取jwt标记的值。

3 个答案:

答案 0 :(得分:39)

您可以使用r.Header.Get

func yourHandler(w http.ResponseWriter, r *http.Request) {
    ua := r.Header.Get("User-Agent")
    ...
}

答案 1 :(得分:11)

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "%s %s %s \n", r.Method, r.URL, r.Proto)
    //Iterate over all header fields
    for k, v := range r.Header {
        fmt.Fprintf(w, "Header field %q, Value %q\n", k, v)
    }

    fmt.Fprintf(w, "Host = %q\n", r.Host)
    fmt.Fprintf(w, "RemoteAddr= %q\n", r.RemoteAddr)
    //Get value for a specified token
    fmt.Fprintf(w, "\n\nFinding value of \"Accept\" %q", r.Header["Accept"])
}

从浏览器连接到http://localhost:8000/将在浏览器中打印输出。

答案 2 :(得分:3)

注意:接受的答案缺少一些信息。

标头代表HTTP标头中的键/值对。 它被定义为一个映射,其中key为字符串类型,value为字符串类型的数组。

type Header map[string][]string

实际上,r.Header.Get获取与给定键关联的第一个值,即它仅从索引0获取第一个字符串。

如果标头只有一个值,但是有多个值,则可能会漏掉一些信息。

例如。 User-Agent标头针对同一个键具有多个值。

user-agent: ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)",  "AppleWebKit/537.36 (KHTML, like Gecko)", "Chrome/80.0.3987.106 Safari/537.36",]

因此,如果您使用r.Header.get("User-Agent"),它将只返回

如果要获取所有值,可以使用以下方法:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)