【问题标题】:How can I read a header from an http request in golang?如何从 golang 中的 http 请求中读取标头?
【发布时间】:2017-09-03 07:49:01
【问题描述】:

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

【问题讨论】:

  • 你试过reading the Docs吗?
  • 是的,我有。我一直在尝试使用括号而不是方括号,谢谢。

标签: go


【解决方案1】:

您可以使用r.Header.Get:

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

【讨论】:

  • 它返回字符串数组所以没用
  • 如果有多个值(多个标题同名)时很有用。
  • 我想知道是什么让你写wrua而不是responseWriterrequestuserAgent
  • @DanielVartanov 在 Go 中使用单字母变量名被认为是惯用的:github.com/golang/go/wiki/CodeReviewComments#variable-names,“Go 中的变量名应该短而不是长。对于范围有限的局部变量尤其如此。首选c 到 lineCount。首选 i 到 sliceIndex。"
  • @MaxPRafferty 哦,不!不过感谢分享
【解决方案2】:
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/ 将在浏览器中打印输出。

【讨论】:

    【解决方案3】:

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

    Header 表示 HTTP 标头中的键值对。 它被定义为一个map,其中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) ,而不是其余的值。

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

    req.Header["User-Agent"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2012-02-09
      • 1970-01-01
      • 2018-12-05
      • 2020-02-13
      相关资源
      最近更新 更多