

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 自訂 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) 時，可以使用 [WithHTTPClient](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#WithHTTP) 包裝用戶端並將產生的值傳遞給 ，以提供自訂 HTTP 用戶端`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)選項的用戶端。

### 設定 Proxy
<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>

 以下是可以修改以調整 HTTP 用戶端的幾個其他`Transport`設定。您可以在[傳輸](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>

 如果請求具有「預期：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**。