【问题标题】:Send HTTP/2 request发送 HTTP/2 请求
【发布时间】:2021-12-29 06:35:47
【问题描述】:

我正在尝试从 Go 发送 HTTP/2 请求,但我不能。

client := &net.Client{}
request, err := net.NewRequest("GET", someUrl, nil)
if err != nil {
    return "", err
}

// some headers
// some cookies

client.Transport = &http2.Transport{}

response, err := client.Do(request)

如果我打印转储请求

dr, _ := httputil.DumpRequest(request, false)
fmt.Println(string(dr))

结果如下

GET /some/url HTTP/1.1
// some headers
// some cookies

为什么?

【问题讨论】:

  • @SteffenUllrich 这可能是一个答案。 RTFM 风格的答案很常见。

标签: go https http2 transport


【解决方案1】:

我正在尝试从 Go 发送 HTTP/2 请求,但我不能。 ...

dr, _ := httputil.DumpRequest(request, false)
fmt.Println(string(dr))

结果如下

GET /some/url HTTP/1.1
// some headers
// some cookies

DumpRequest 不会打印在线发送的请求,并且特别不适合检查是否使用了 HTTP/2。 documentation 明确指出:

DumpRequest 以其 HTTP/1.x 线路表示返回给定的请求。它只能由服务器用于调试客户端请求。返回的表示只是一个近似值;初始请求的一些细节在解析为 http.Request 时会丢失。特别是,标头字段名称的顺序和大小写丢失。多值标头中的值顺序保持不变。 HTTP/2 请求以 HTTP/1.x 形式转储,而不是其原始二进制表示形式。”

【讨论】:

  • 哇!但是不知道如何检查是否正在发送http2..?
  • @overtheman: “但是不知道如何检查是否正在发送 http2..?” - 这是一个不同的问题,应该单独提出。这是“为什么?”,即解释为什么在使用 DumpRequest 时只看到 HTTP/1。
猜你喜欢
  • 2018-07-07
  • 2016-03-31
  • 2021-08-18
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2021-05-09
  • 2016-11-01
相关资源
最近更新 更多