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?
谢谢。但是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://,也需要满足以下条件:
- 服务器支持HTTP/2:服务器必须配置为支持HTTP/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是自动启用的,无需额外代码。

