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

Aym*_*ark 30 go

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

nba*_*ari 52

你可以使用r.Header.Get:

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

  • @DanielVartanov它在Go中被认为是惯用的,以使用单字母变量名称:https://github.com/golang/go/wiki/CodeReviewComments#variable-names,“ Go中的变量名称应该短而不是长。这尤其正确对于范围有限的局部变量。c优于lineCount。i优于sliceIndex。” (5认同)
  • 如果有多个值(具有相同名称的多个标头),这很有用。 (2认同)
  • 我想知道是什么让你写“w”、“r”和“ua”而不是“responseWriter”、“request”和“userAgent”? (2认同)
  • @MaxPRafferty 哦不!不过还是谢谢分享 (2认同)

Faa*_*lak 12

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

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

type Header map[string][]string
Run Code Online (Sandbox Code Playgroud)

实际上,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",]
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用r.Header.get("User-Agent"),它将Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) 返回而不返回其余值。

如果你想获得所有的值,你可以使用这个:

req.Header["User-Agent"]
Run Code Online (Sandbox Code Playgroud)


Rav*_*avi 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"])
}
Run Code Online (Sandbox Code Playgroud)

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