Golang中http.Get(url)返回HTTP/1.1响应的问题探讨

Golang中http.Get(url)返回HTTP/1.1响应的问题探讨 我正在调用一个API来获取响应体:

resp, err := http.Get(url)

返回

&{200 OK 200 HTTP/1.1 1 1 map[Content-Type:[application/json]

这个HTTP/1.1是因为使用了**http://吗?或者,在不使用https://**的情况下,我该如何使用HTTP/2?

5 回复

谢谢。但是HTTP/2在速度上有什么不同吗? 我该如何使用这个?

更多关于Golang中http.Get(url)返回HTTP/1.1响应的问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于HTTP/2,请使用golang.org/x/net/http2

说实话,我还没有机会测试它。 为什么你想使用 HTTP/2 呢? 如果你想提升性能,我建议你使用 https://grpc.io/

如果您使用那些隐式为您创建 Request 的函数和方法,它始终会是 HTTP/1.1,这是硬编码的:

https://golang.org/src/net/http/request.go?s=29530:29552#L876

如果您想要其他版本,我猜您需要自己构建 Request

在Go中,http.Get()返回的HTTP版本主要由服务器支持和客户端配置决定,而不仅仅是URL协议。HTTP/1.1响应通常是因为服务器或客户端默认使用HTTP/1.1,与使用http://https://没有必然联系。

要启用HTTP/2,即使使用http://,也需要满足以下条件:

  1. 服务器支持HTTP/2:服务器必须配置为支持HTTP/2协议。
  2. 客户端启用HTTP/2:Go的http.Client默认在TLS(即https://)下自动启用HTTP/2,但在非TLS(即http://)下需要显式配置。

示例代码:在http://下强制使用HTTP/2

以下示例展示如何配置客户端以在http://下使用HTTP/2(需要服务器支持HTTP/2 over明文):

package main

import (
    "fmt"
    "net/http"
    "golang.org/x/net/http2"
)

func main() {
    client := &http.Client{
        Transport: &http2.Transport{
            // 允许非TLS(http://)的HTTP/2连接
            AllowHTTP: true,
            // 设置DialTLS以处理非TLS连接
            DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
                return net.Dial(network, addr)
            },
        },
    }

    resp, err := client.Get("http://example.com/api")
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()

    fmt.Printf("响应协议: %s\n", resp.Proto) // 应输出 HTTP/2.0
}

注意事项:

  • 服务器支持:如果服务器不支持HTTP/2 over明文(即http://),客户端将回退到HTTP/1.1。
  • 默认行为:对于https://,Go的http.Client默认自动协商HTTP/2,无需额外配置。例如:
resp, err := http.Get("https://example.com") // 自动尝试HTTP/2

检查响应协议

可以通过resp.Proto字段检查实际使用的HTTP版本:

fmt.Println(resp.Proto) // 输出: HTTP/2.0 或 HTTP/1.1

总结

  • http://返回HTTP/1.1是因为默认配置或服务器不支持HTTP/2 over明文。
  • 要强制在http://下使用HTTP/2,需配置客户端并确保服务器支持。
  • 对于https://,HTTP/2是自动启用的,无需额外代码。
回到顶部