2011-12-29 11 views
5

TWebRequest(およびTWebResponse)オブジェクトのすべてのヘッダーフィールドをダンプすることは可能ですか? 現在、私はGetFieldByName()を使用して、それらをWriteln()で印刷しますが、これはヘッダーフィールドの名前がわかっている場合にのみ有効です。私は、各フィールドを列挙するためにすべてのヘッダーフィールド名を取得する方法を探していますが、私はそれを行う方法が見つかりませんでした。TWebRequest HTTPヘッダーフィールドを列挙する

私はREST datasnapコンソールアプリケーションを作成し、すべてのHTTP要求/応答をコンソールに記録したいとします。

答えて

4

AFAIKこれは可能ではありません(Delphi XE2)。

生のヘッダーにアクセスするためにちょっとしたトリックを使用しました。 しかし、これは本当に汚いです!あなた自身のリスクで使用してください!

実際のクラスリクエストクラスは、TIdHTTPAppRequestです(警告:異なるタイプのウェブブラウザーアプリケーションで異なる可能性があります。このコードをさまざまな種類のdatasnapアプリでテストしていません)。

だから、トリックがある:あなたが保護されたFRequestInfoフィールドにacccessを持つように、このヘルパーを使用することができます。このように

TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest 
    public 
    function GetRequestInfo: TIdEntityHeaderInfo; 
    end; 

    implementation 

    function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo; 
    begin 
    Result := FRequestInfo; 
    end; 

は、次のようなクラスヘルパーを宣言します。次のコードを使用することができますOnActionイベントハンドラで

は、すべてのヘッダ名を持っている:

procedure Twm.wmWebActionItem1Action(Sender: TObject; Request: TWebRequest; 
       Response: TWebResponse; var Handled: Boolean); 
var 
    HeadersCount: Integer; 
    I: Integer; 
    sw: TStreamWriter; 
begin 
    Response.ContentType := 'text/plain'; 
    Response.ContentStream := TMemoryStream.Create; 
    sw := TStreamWriter.Create(Response.ContentStream); 
    try 
    HeadersCount := TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.Count; 
    for I := 0 to HeadersCount - 1 do 
     sw.WriteLine(TIdHTTPAppRequest(Request).GetRequestInfo.RawHeaders.Names[I]); 
    finally 
    sw.Free; 
    end; 
    Handled := True; 
end; 

しかし、TWebRequestは、生のヘッダを読み取ることができないことが悪いです。それは変更する必要があります!

+0

それはトリックに感謝しました:) – MBulli

関連する問題