即使强制尝试设置为false,Go http请求也会返回到http2

即使强制尝试设置为false,Go http请求也会返回到http2,http,go,http2,Http,Go,Http2,在Go的http包抛出以下错误的地方,每隔几次请求就会发生一次奇怪的事情: http2: server sent GOAWAY and closed the connection; LastStreamID=19999, ErrCode=NO_ERROR, debug="" 因此我意识到默认传输已将ForceAttemptHTTP2设置为true(第48行),因此我手动将其设置为false,如下所示: transport := &http.Transport

在Go的
http
包抛出以下错误的地方,每隔几次请求就会发生一次奇怪的事情:

http2: server sent GOAWAY and closed the connection; LastStreamID=19999, ErrCode=NO_ERROR, debug=""
因此我意识到默认传输已将
ForceAttemptHTTP2
设置为
true
(第48行),因此我手动将其设置为false,如下所示:

    transport := &http.Transport{
        ForceAttemptHTTP2: false,
    }
    httpClient := &http.Client{Transport: transport}
但即使这样做了,我仍然得到相同的http2错误,而不是http1,这对我来说没有意义

我是网络新手,所以我觉得我错过了一些显而易见的东西

我想问题是如何强制
http
包只使用
http
,而不使用
http2

这似乎可以做到:

package main

import (
   "crypto/tls"
   "net/http"
)

func main() {
   client := &http.Client{
      Transport: &http.Transport{
         TLSNextProto: map[string]func(string, *tls.Conn)http.RoundTripper{},
      },
   }
   req, e := http.NewRequest("HEAD", "https://stackoverflow.com", nil)
   if e != nil {
      panic(e)
   }
   res, e := client.Do(req)
   if e != nil {
      panic(e)
   }
   println(res.Proto == "HTTP/1.1")
}
必须禁用HTTP/2的程序可以通过设置
Transport.TLSNextProto
(对于客户端)或
Server.TLSNextProto
(对于服务器)到非零的空映射

诚然,这是一种非常笨拙的语法,所以您可能更喜欢 而是:

package main

import (
   "net/http"
   "os"
)

func main() {
   os.Setenv("GODEBUG", "http2client=0")
   req, e := http.NewRequest("HEAD", "https://stackoverflow.com", nil)
   if e != nil {
      panic(e)
   }
   res, e := new(http.Client).Do(req)
   if e != nil {
      panic(e)
   }
   println(res.Proto == "HTTP/1.1")
}

不强制HTTP/2与禁用HTTP/2不同。这是否回答了您的问题?你能给我更多的信息吗?我不确定如何将其应用到HTTP客户端是的,很好。我也不太清楚如何将其翻译到客户端。第三种(不那么笨重)方式:
go build-tags nethttpomit http2
。谢谢!这就是我要找的!