

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自定义 HTTP 客户端
<a name="configure-http"></a>

 适用于 Go 的 AWS SDK 使用具有默认配置值的默认 HTTP 客户端。尽管您可以更改其中的一些配置值，但对于在具有高吞吐量和低延迟要求的环境中使用适用于 Go 的 AWS SDK 的客户而言，默认的 HTTP 客户端和传输并未充分配置。有关更多信息，请参阅[常见问题](faq-gosdk.md)，因为配置建议因具体工作负载而异。本节介绍如何配置自定义 HTTP 客户端，以及如何使用该客户端创建适用于 Go 的 AWS SDK 调用。

 为了帮助您创建自定义 HTTP 客户端，本节介绍如何使用 [NewBuildableClient](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/transport/http#NewBuildableClient) 配置自定义设置，以及如何将该客户端与适用于 Go 的 AWS SDK 服务客户端结合使用。

 我们来确定要自定义的内容。

## 在配置加载期间覆盖
<a name="overriding-during-configuration-loading"></a>

 调用 [LoadDefaultConfig](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#LoadDefaultConfig) 时，可以提供自定义 HTTP 客户端，方法是使用 [WithHTTPClient](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#WithHTTP) 包装客户端并将结果值传递给 `LoadDefaultConfig`。例如，传递 `customClient` 作为我们的客户端：

```
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithHTTPClient(customClient))
```

## 超时
<a name="timeout"></a>

 可以为 `BuildableHTTPClient` 配置请求超时限制。此超时包括进行连接、处理任何重定向和读取完整响应正文所需的时间。例如，修改客户端超时：

```
import "github.com/aws/aws-sdk-go-v2/aws/transport/http"

// ...

httpClient := http.NewBuildableClient().WithTimeout(time.Second*5)
```

## 拨号器
<a name="dialer"></a>

 `BuildableHTTPClient` 提供了一种生成器机制，用于使用修改后的[拨号器](https://golang.org/pkg/net/#Dialer)选项来构造客户端。下面的示例演示了如何配置客户端 `Dialer` 设置。

```
import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
import "net"

// ...

httpClient := awshttp.NewBuildableClient().WithDialerOptions(func(d *net.Dialer) {
    d.KeepAlive = -1
    d.Timeout = time.Millisecond*500
})
```

### 设置
<a name="settings"></a>

#### Dialer.KeepAlive
<a name="dialerkeepalive"></a>

 此设置表示活动网络连接的“保持连接”时间。

 设置为负值可禁用“保持连接”。

 如果协议和操作系统支持，则设置为 **0** 可启用“保持连接”。

 不支持“保持连接”的网络协议或操作系统会忽略此字段。默认情况下，TCP 启用“保持连接”。

 请参阅 [https://golang.org/pkg/net/\$1Dialer.KeepAlive](https://golang.org/pkg/net/#Dialer.KeepAlive) 

 将 `KeepAlive` 设置为 **time.Duration**。

#### Dialer.Timeout
<a name="dialertimeout"></a>

 此设置表示拨号等待建立连接的最长时间。

 默认为 30 秒。

 请参阅 [https://golang.org/pkg/net/\$1Dialer.Timeout](https://golang.org/pkg/net/#Dialer.Timeout) 

 将 `Timeout` 设置为 **time.Duration**。

## 传输
<a name="transport"></a>

 `BuildableHTTPClient` 提供了一种生成器机制，用于使用修改后的[传输](https://golang.org/pkg/net/http#Transport)选项来构造客户端。

### 配置代理
<a name="configuring-a-proxy"></a>

 如果无法直接连接到互联网，可以使用 Go 支持的环境变量（`HTTP_PROXY`/`HTTPS_PROXY`）或创建自定义 HTTP 客户端来配置代理。以下示例将客户端配置为使用 `PROXY_URL` 作为代理端点：

```
import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
import "net/http"

// ...

httpClient := awshttp.NewBuildableClient().WithTransportOptions(func(tr *http.Transport) {
    proxyURL, err := url.Parse("PROXY_URL")
    if err != nil {
        log.Fatal(err)
    }
    tr.Proxy = http.ProxyURL(proxyURL)
})
```

### 其他设置
<a name="other-settings"></a>

 以下是一些其他 `Transport` 设置，可以修改这些设置以调整 HTTP 客户端。此处未描述的任何其他设置均可在[传输](https://golang.org/pkg/net/http/#Transport)类型文档中找到。可按以下示例所示应用这些设置：

```
import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
import "net/http"

// ...

httpClient := awshttp.NewBuildableClient().WithTransportOptions(func(tr *http.Transport) {
    tr.ExpectContinueTimeout = 0
    tr.MaxIdleConns = 10
})
```

#### Transport.ExpectContinueTimeout
<a name="transportexpectcontinuetimeout"></a>

 如果请求有“Expect: 100-continue”标头，则此设置表示在完全写入请求标头后等待服务器初始响应标头的最长时间。该时间不包括发送请求标头所花费的时间。此超时结束后，HTTP 客户端会发送其有效载荷。

 默认值 1 秒。

 设置为 **0** 表示没有超时，无需等待即可发送请求有效载荷。一个使用案例是，当代理或第三方服务遇到问题时，它们会占用一个会话，这与后文示例函数中使用 Amazon S3 的情况类似。

 请参阅 [https://golang.org/pkg/net/http/\$1Transport.ExpectContinueTimeout](https://golang.org/pkg/net/http/#Transport.ExpectContinueTimeout) 

 将 `ExpectContinue` 设置为 **time.Duration**。

#### Transport.IdleConnTimeout
<a name="transportidleconntimeout"></a>

 此设置表示在 HTTP 请求之间保持空闲网络连接处于活动状态的最长时间。

 设置为 **0** 表示没有限制。

 请参阅 [https://golang.org/pkg/net/http/\$1Transport.IdleConnTimeout](https://golang.org/pkg/net/http/#Transport.IdleConnTimeout) 

 将 `IdleConnTimeout` 设置为 **time.Duration**。

#### Transport.MaxIdleConns
<a name="transportmaxidleconns"></a>

 此设置表示所有主机上空闲（保持连接）连接的最大数量。增大此值的一个使用案例是，您在短时间内发现来自相同客户端的许多连接 

 **0** 表示没有限制。

 请参阅 [https://golang.org/pkg/net/http/\$1Transport.MaxIdleConns](https://golang.org/pkg/net/http/#Transport.MaxIdleConns) 

 将 `MaxIdleConns` 设置为 **int**。

#### Transport.MaxIdleConnsPerHost
<a name="transportmaxidleconnsperhost"></a>

 此设置表示每台主机要保留的空闲（保持连接）连接的最大数量。增大此值的一个使用案例是，您在短时间内发现来自相同客户端的许多连接 

 默认情况下，每台主机有两个空闲连接。

 设置为 **0** 将使用 DefaultMaxIdleConnsPerHost（2）。

 请参阅 [https://golang.org/pkg/net/http/\$1Transport.MaxIdleConnsPerHost](https://golang.org/pkg/net/http/#Transport.MaxIdleConnsPerHost) 

 将 `MaxIdleConnsPerHost` 设置为 **int**。

#### Transport.ResponseHeaderTimeout
<a name="transportresponseheadertimeout"></a>

 此设置表示等待客户端读取响应标头的最长时间。

 如果客户端无法在这段时间内读取响应的标头，则请求将失败并显示超时错误。

 使用长时间运行的 Lambda 函数时请谨慎设置此值，因为在 Lambda 函数完成或超时之前，该操作不会返回任何响应标头。但是，您仍然可以在 \$1\$1 InvokeAsync\$1\$1 API 操作中使用此选项。

 默认为没有超时；将会一直等待。

 请参阅 [https://golang.org/pkg/net/http/\$1Transport.ResponseHeaderTimeout](https://golang.org/pkg/net/http/#Transport.ResponseHeaderTimeout) 

 将 `ResponseHeaderTimeout` 设置为 **time.Duration**。

#### Transport.TLSHandshakeTimeout
<a name="transporttlshandshaketimeout"></a>

 此设置表示等待 TLS 握手完成的最长时间。

 默认为 10 秒。

 零表示没有超时。

 请参阅 [https://golang.org/pkg/net/http/\$1Transport.TLSHandshakeTimeout](https://golang.org/pkg/net/http/#Transport.TLSHandshakeTimeout) 

 将 `TLSHandshakeTimeout` 设置为 **time.Duration**。