HTTP/1

TsgcHTTP1Client は TIdHTTP Indy コンポーネントを継承し、いくつかの新しいプロパティを追加した非ビジュアルコンポーネントです。

このコンポーネントはsgcHTTPユニットにあります。

TLSOptions

HTTP/1 プロトコルを使用してセキュアな SSL/TLS サーバーに接続する方法を設定できます。

 

ALPNProtocols: サーバーに送信されるALPNプロトコルのリスト。

RootCertFile: ルート証明書ファイルへのパス。

CertFile: 証明書ファイルへのパス。

KeyFile: 証明書鍵ファイルへのパス。

Password: 証明書がパスワードで保護されている場合は、ここに設定します。

VerifyCertificate: 証明書を検証する場合はこのプロパティを有効にします。SSL 検証のカスタマイズには OnSSLVerifyPeer イベントを使用します。

VerifyDepth: X.509 証明書の検証実行時に許可されるリンクの最大数を表す整数プロパティ。

Version: デフォルトでは TLS 1.0 を使用します。サーバーがより高いTLSバージョンを要求する場合は、ここで選択できます。

Preset: 一度の代入で一連の安全なデフォルト値を適用します。tlspCustom(デフォルト)では、各オプションは手動で設定された値を保持します。tlspSecureDefaults を設定すると、VerifyCertificate が有効になり、Version が少なくとも TLS 1.2 に引き上げられ(より低いバージョンまたは未定義のバージョンが設定されていた場合)、サーバー証明書のホスト名検証が有効になります。

プロキシ: プロキシサーバーを経由して接続するかどうかを定義できます。以下のプロキシサーバーに接続できます。

pxyHTTP: HTTPプロキシサーバー。

pxySocks4: SOCKS4 プロキシサーバー。

pxySocks4A: SOCKS4A プロキシサーバー。

pxySocks5: SOCKS5 プロキシサーバー。

IOHandler: TLS を使用した接続に使用するライブラリを選択します。

iohOpenSSL: OpenSSL ライブラリを使用し、Indy コンポーネントのデフォルトです。win32/win64 用の OpenSSL ライブラリのデプロイが必要です。

iohSChannel: Microsoft が Windows 向けに実装したセキュリティプロトコルである Secure Channel を使用します。OpenSSL ライブラリのデプロイが不要です。Windows 32/64 ビットのみで動作します。

OpenSSL_Options: OpenSSL ライブラリの設定。

APIVersion: 使用する OpenSSL API を定義できます。

oslAPI_1_0: API 1.0 OpenSSL を使用します。Indy で最後にサポートされたバージョンです。

oslAPI_1_1: API 1.1のOpenSSLを使用します。カスタムIndyライブラリが必要で、OpenSSL 1.1.1ライブラリ(TLS 1.3サポート付き)の使用が可能になります。

oslAPI_3_0: API 3.0 OpenSSLを使用します。当社のカスタムIndyライブラリが必要であり、OpenSSL 3.0.0ライブラリの使用を可能にします(TLS 1.3サポート付き)。

LibPath: OpenSSL ライブラリの場所を設定できます。

oslpNone: これがデフォルトです。OpenSSL ライブラリはバイナリと同じフォルダーまたは既知のパスに存在する必要があります。

oslpDefaultFolder: すべての IDE パーソナリティに対して、ライブラリが格納されるべき OpenSSL パスを自動的に設定します。

oslpCustomFolder: このオプションが選択されている場合、プロパティ LibPathCustom にフルパスを定義します。

LibPathCustom: LibPath = oslpCustomFolder の場合、ここに OpenSSL ライブラリのフルパスを定義します。

UnixSymLinks: Unix システムでシンボリックリンクの読み込みを有効または無効にします(デフォルトでは有効です。OSX64 は除きます)。

oslsSymLinksDefault: デフォルトでは、OSX64 以外でシンボリックリンクが有効です(macOS Monterey 以降では、バージョンなしでライブラリをロードしようとすると失敗します)。

oslsSymLinksLoadFirst: バージョン管理されたライブラリを読み込む前に、まずシンボリックリンクを読み込みます。

oslsSymLinksLoad: バージョン付きライブラリの読み込みを試みた後にシンボリックリンクを読み込みます。

oslsSymLinksDontLoad: SymLinksを読み込みません。

MinVersion: ここに、クライアントがセキュアなサーバーに接続するために使用する最小バージョンを設定します。デフォルトでは、値はtlsUndefinedで、これは最小バージョンがVersionプロパティで設定されたものと同じであることを意味します。例: クライアントがTLS 1.2またはTLS 1.3のみを使用して接続するように設定したい場合は、次の値を設定します。

 

SSLOptions.Version := tls1_3;

SSLOptions.OpenSSL_Options.MinVersion := tls1_2;

X509Checks: 追加の X509 証明書検証を有効にするにはこのプロパティを使用してください:

Mode: 検証するオプションを選択します。

oslx509chHostName: ホスト名証明書を検証します。

oslx509chIPAddress: 証明書の IP アドレスを検証します。

HostName: リクエストと異なる場合はホスト名を設定します。

IPAddress: リクエストと異なる場合は IP アドレスを設定します。

 

SChannel_Options: Windows 証明書ストアから証明書を使用できます。

CertHash: 証明書のハッシュ値です。PowerShell で dir コマンドを実行することで証明書のハッシュ値を確認できます。

CipherList: 使用する暗号スイートを(":" で区切って)設定できます。例: CALG_AES_256:CALG_AES_128

CertStoreName: 証明書が保存されているストア名。以下のいずれかを選択してください。

scsnMY(デフォルト)

scsnCA

scsnRoot

scsnTrust

CertStorePath: 証明書が保存されているストアパス。以下のいずれかを選択してください:

scspStoreCurrentUser(デフォルト)

scspStoreLocalMachine

 

ログ

Log プロパティが有効な場合、ソケットメッセージを指定されたログファイルに保存します。デバッグに役立ちます。

 

LogOptions.FileName: ファイル名のフルパス。

 

認証

OAuth2 または JWT を使用して認証できます。

 

 

RetryOptions

オプションのジッター付き指数バックオフを使用して、失敗した HTTP リクエストを自動的に再試行します。再試行はデフォルトで無効になっているため、Enabled を true に設定しない限り動作は変わりません。レスポンスのステータスコードが StatusCodes に含まれている場合、または一時的なネットワークエラー(接続の切断、ソケットエラー、接続タイムアウトまたは読み取りタイムアウト)が発生した場合に、リクエストが再試行されます。

Enabled: 失敗したリクエストの自動再試行を有効にします。デフォルトは false です。

MaxRetries: 最初のリクエスト後の最大再試行回数です。デフォルトは 3 です。

InitialInterval: 最初の再試行までの遅延(ミリ秒)です。デフォルトは 500 です。

MaxInterval: 再試行間の最大遅延(ミリ秒)です。デフォルトは 30000 です。

Multiplier: 各試行後に遅延に適用される係数です。デフォルトは 2.0 で、再試行のたびに遅延が 2 倍になります(500、1000、2000...)。

Jitter: すべての遅延に適用される 0 から 1 の間のランダム係数です(0.2 は各遅延を最大 20% 変動させます)。これにより、多数のクライアントがまったく同じタイミングで再試行することを防ぎます。デフォルトは 0.2 です。

HonorRetryAfter: サーバーが Retry-After ヘッダー(秒数または HTTP 日付として、通常は 429 または 503 レスポンスとともに)を返した場合、クライアントは計算されたバックオフ遅延ではなく、サーバーが要求した時間だけ待機します。デフォルトは true です。

StatusCodes: 再試行をトリガーする HTTP ステータスコードのカンマ区切りリストです。デフォルトは "429,502,503,504" です。

例:試行間隔を 1 秒から開始し、最大 5 回まで再試行します。


oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.RetryOptions.Enabled := True;
oHTTP.RetryOptions.MaxRetries := 5;
oHTTP.RetryOptions.InitialInterval := 1000;
ShowMessage(oHTTP.Get('https://www.esegece.com'));

AI プロバイダークライアント(OpenAI、Anthropic、Gemini、およびその他の LLM API クライアント)は、それぞれの Options の RetryOptions プロパティを通じて、この同じ再試行エンジンを使用します。

非同期リクエスト

デフォルトでは、HTTP1ClientはブロッキングリクエストをするためHTTPリクエストメソッドを呼び出した後、クライアントはサーバーからのレスポンスを待ちます。あるいは、非同期メソッドを使用してこれらのHTTPリクエストを別スレッドで実行し、リクエストが呼び出されたスレッドをブロックしないようにすることができます。次の非同期メソッドが実装されています:

 

 

これらのメソッドを呼び出した後、レスポンスを待機せずにコードは次の行に進み、レスポンスはイベント OnAsyncResponse を使用して処理できます。

 


procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
    TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);

非同期リクエストの処理中にエラーが発生した場合、イベント OnAsyncException で例外が発生します。

 

Futures

Delphi 2010 以降では、クライアントはイベントハンドラーを必要としない future スタイルの非同期リクエストも実装しています:


function GetFuture(const AURL: string): IsgcFuture<string>;
function PostFuture(const AURL: string; aData: TStream): IsgcFuture<string>;

リクエストはバックグラウンドスレッドで実行され、返された future はレスポンス本文で解決されます。Await を呼び出すとレスポンスが到着するまでブロックし、ThenProc で継続処理の中で利用し、OnError で失敗を処理します。Cancel を呼び出すと、基盤となる HTTP リクエストを完了まで実行させるのではなく中止します。


oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.GetFuture('https://www.esegece.com')
  .ThenProc(procedure(const aBody: string)
    begin
      Log(aBody);
    end)
  .OnError(procedure(E: Exception)
    begin
      Log(E.Message);
    end);

使用例

HTTPs サーバーへ GET メソッドをリクエストし、TLS 1.2 を使用します。


oHTTP := TsgcHTTP1Client.Create(nil);
Try
  oHTTP.TLSOptions.Version := tls1_2;
  ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
  oHTTP.Free;
End;

openSSL 1.1TLS 1.3 を使用して HTTPs サーバーに GET リクエストを送信


oHTTP := TsgcHTTP1Client.Create(nil);
Try
  oHTTP.TLSOptions.OpenSSL_Options.APIVersion := oslAPI_1_1;
  oHTTP.TLSOptions.Version := tls1_3;
  ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
  oHTTP.Free;
End;

非同期POSTメソッドを要求し、OnAsyncResultEventを使用して応答を読み取ります。

 


procedure OnAsyncExceptionEvent(Sender: TObject; const aThread:
    TsgcThread; const E: Exception);
begin
  Log(E.Message);
end;
procedure OnAsyncResultEvent(Sender: TObject; const aRequest:
    TsgcHTTPAsyncRequest; const aResponse: TIdHTTPResponse);
begin
  if aResponse.ResponseCode = 200 then
    Log('ok', aRequest.Response)
  else 
    Log('error', aRequest.Response);
end;
oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.OnAsyncResult := OnAsyncResultEvent;
oHTTP.OnAsyncException := OnAsyncResultEvent;
oRequest := TStringStream.Create('body');
oResponse := TStringStream.Create('');
oHTTP.PostAsync('https://localhost/test', oRequest, oResponse);

 

Windows 用 SChannel を使用して HTTPS サーバーに GET メソッドをリクエストします。


oHTTP := TsgcHTTP1Client.Create(nil);
Try
  oHTTP.TLSOptions.IOHandler := iohSChannel;
  oHTTP.TLSOptions.Version := tls1_2;
  ShowMessage(oHTTP.Get('https://www.google.es'));
Finally
  oHTTP.Free;
End;

データイベントを取得するために SSE メソッドをリクエストします

 


oHTTP := TsgcHTTP1Client.Create(nil);
oHTTP.OnSSEMessage := OnSSEMessageEvent;
oHTTP.GetSSE('https://www.yoursite.com/sse');
 
procedure OnSSEMessageEvent(Sender: TObject; const aMessage: string; var Cancel: Boolean);
begin
  ShowMessage(aMessage);
end;

 

イベント

OnSSEMessage

 

新しいSSEメッセージを受信したときにイベントが呼び出されます。

 

OnSSLVerifyPeer

 

証明書の検証が有効な場合、このイベントでサーバー証明書を検証して受け入れるかどうかを決定できます。

 

OnSSLGetHandler

 

このイベントは SSL ハンドラーが作成される前に発生します。ここで独自の SSL ハンドラーを作成し(TIdServerIOHandlerSSLBase または TIdIOHandlerSSLBase を継承する必要があります)、必要なプロパティを設定できます。

 

OnSSLAfterCreateHandler

 

カスタムSSLオブジェクトが作成されていない場合、OpenSSLハンドラーを使用してデフォルトのオブジェクトが作成されます。SSLハンドラーのプロパティにアクセスして、必要に応じて変更できます。

 

OnAsyncResult

 

このイベントは、Asyncメソッド(GetAsync、PutAsyncなどのメソッドを使用)を要求した後に呼び出されます。Responseパラメータを使用して、要求の結果を確認してください。

 

OnAsyncException

 

非同期リクエストの処理中にエラーが発生した場合、このイベントは発生した例外とともに呼び出されます。