11.2 RoundTripperインタフェースによって処理を分離する

「10.5  Middlewareパターンを使って処理を分離する 」では個々のハンドラーとは別に、サーバー側の共通的な関心事を組み込む仕組みとしてMiddlewareパターンを紹介しました。本節ではクライアント側の視点からリトライやロギング・認証認可といったリクエスト共通の関心事を、個々のリクエストの実装と分離する方法について紹介します。

基本になるのはGoのHTTPクライアントである http.ClinetTransport フィールドです。

リスト11-5: net/http のHTTPクライアントのフィールド
type Client struct {
    Transport RoundTripper
    CheckRedirect func(req *Request, via []*Request) error
    Jar CookieJar
    Timeout time.Duration
}

この Transport フィールドは以下の RoundTripper インタフェースになっています。

type RoundTripper interface {
    RoundTrip(*Request) (*Response, error)
}

RoundTrip() のシグネチャを見るとわかるように、 RoundTrip() はリクエスト (*http.Request) を受け取って、レスポンス (*http.Response) を返却するメソッドが定義されており、実際のHTTP通信を行う役割を担っています。

RoundTripper インタフェースに値を指定せず nil でリクエストした場合、