HTTP リクエストの透明な変更

GolangBeginner
オンラインで実践に進む

はじめに

このプロジェクトでは、Go のhttp.RoundTripperインターフェイスを使って HTTP リクエストを透明に変更する方法を学びます。リクエストボディの MD5 ハッシュを計算し、それを「X-Md5」フィールドとしてリクエストヘッダに追加するカスタム HTTP トランスポートを作成します。

👀 プレビュー

$ /usr/local/go/bin/go test
PASS
ok      md5transport    0.004s

🎯 タスク

このプロジェクトで学ぶことは以下の通りです。

  • HTTP リクエストとレスポンスに対してカスタム操作を行うためにhttp.RoundTripperインターフェイスをどのようにカプセル化するか。
  • リクエストボディの MD5 ハッシュをどのように計算し、それをリクエストヘッダに追加するか。
  • MD5 ハッシュを計算した後でリクエストボディをどのようにリセットして元のリクエスト状態を維持するか。

🏆 成果

このプロジェクトを完了すると、以下のことができるようになります。

  • Go における HTTP リクエストの透明な変更の概念を理解する。
  • リクエストとレスポンスに対して様々な操作を行うことができるカスタム HTTP トランスポート層を実装する。
  • 認証、ロギング、またはリクエスト/レスポンス操作などの追加機能で自分自身のアプリケーションを強化するために知識を適用する。

MD5 計算とヘッダ変更を実装する

このステップでは、リクエストボディの MD5 を計算し、16 進数に変換して、「X-Md5」という名前でリクエストヘッダに追加する簡単なデータ検証関数をどのように実装するか学びます。

  1. エディタでmd5_transport.goファイルを開きます。
  2. importに必要な内容を追加します。
import (
 "bytes"
 "crypto/md5"
 "encoding/hex"
 "io"
 "net/http"
)
  1. Transport構造体のRoundTrip関数に、リクエストボディの MD5 を計算してリクエストヘッダに設定するための次のコードを追加します。
// コードを完成させます
// リクエストボディが nil でなければ、md5 を計算してヘッダに設定します
if req.Body!= nil {
    body, err := io.ReadAll(req.Body)
    if err!= nil {
        // ボディの読み取りエラーがあれば、元のリクエストを返します。
        // リクエストを中断しません
        return t.RoundTripper.RoundTrip(req)
    }

    // md5 を計算します
    md5Hash := md5.Sum(body)
    md5HashStr := hex.EncodeToString(md5Hash[:])

    // md5 をヘッダに設定します
    req.Header.Set("X-Md5", md5HashStr)

    // リクエストボディをリセットします
    req.Body = io.NopCloser(bytes.NewReader(body))
}

このコードはまず、リクエストボディが nil でないかどうかをチェックします。そうでなければ、io.ReadAllを使ってボディ全体を読み取り、md5パッケージを使って MD5 ハッシュを計算し、ハッシュを 16 進数文字列に変換します。そして、計算された MD5 値で「X-Md5」ヘッダを設定します。最後に、bytes.NewReaderを使ってリクエストボディを元の状態にリセットします。

  1. コードを追加した後、md5_transport.goファイルを保存します。

実装をテストする

実装をテストするには、次の手順に従います。

  1. エディタでターミナルを開きます。

  2. プロジェクトディレクトリに移動します。

    cd /home/labex/project
    
  3. テストを実行します。

    /usr/local/go/bin/go test
    

コードが正しく実装されている場合、次の出力が表示されます。

PASS
ok      md5transport    0.004s

これは、テストが通過したことを示しており、MD5 計算とヘッダ変更の実装が期待通りに機能していることを意味します。

HTTP リクエストの透明な変更を理解する

Go では、しばしばhttp.Clientを使ってネットワークリクエストを行います。これは内部的にhttp.Requestを作成し、その後http.RoundTripper.RoundTripを使って実際のリクエストを行います。実際のデータ転送操作はRoundTripの中で行われます。

http.RoundTripperインターフェイスをカプセル化することで、認証、統計、監査ログ記録、およびリクエストの変更など、リクエストとレスポンスに対して様々な操作をユーザに対して透明な方法で行うことができます。

このチャレンジでは、リクエストボディの MD5 を計算してリクエストヘッダに追加する簡単なデータ検証関数を実装しました。これは、http.RoundTripperインターフェイスを使って HTTP リクエストを透明に変更する方法の 1 つの例にすぎません。

自分のモジュールライブラリを設計する際や、他人のコンポーネントを使う際には、この技術をどのように使って追加機能を追加したり、アプリケーションの動作を透明に変更することができるかを考えることができます。

まとめ

おめでとうございます!このプロジェクトを完了しました。実験技術を向上させるために、LabEx でさらに多くの実験を行ってみましょう。

✨ 解答を確認して練習✨ 解答を確認して練習✨ 解答を確認して練習