Go 的标准 DefaultTransport 将 Proxy 设为 ProxyFromEnvironment。单独构造的 &http.Transport{} 的 Proxy 函数为 nil,因此不会选择任何代理。

这种差异可能在仅为修改超时而添加传输之后出现。既然标准默认值仍然安装着,就克隆它并修改所需的字段:

transport := http.DefaultTransport.(*http.Transport).Clone()
transport.ResponseHeaderTimeout = 15 * time.Second

client := &http.Client{
    Transport: transport,
    Timeout: 30 * time.Second,
}

克隆会保留环境代理选择和其他默认传输设置。该类型断言假设应用程序没有用其他 RoundTripper 替换 DefaultTransport。

对于有意从零构建的传输,如果这就是它的路由策略,请显式设置 Proxy: http.ProxyFromEnvironment。显式的 ProxyURL 函数表达了另一种策略:一个选定的中间方。

在并发请求使用它之前配置好传输,然后在整个工作负载中复用它。修改共享的默认对象可能影响不相关的客户端。

自定义 TLS 设置是独立的。保留代理发现并不需要禁用证书校验,而且那会改变每个匹配的 HTTPS 请求的安全性。

相关文章