【问题标题】:Enumerate TWebRequest HTTP header fields枚举 TWebRequest HTTP 标头字段
【发布时间】:2011-12-29 10:08:17
【问题描述】:

是否可以转储 TWebRequest(和 TWebResponse)对象的所有标头字段? 目前我使用 GetFieldByName() 并使用 Writeln() 打印它们,但这只有在我已经知道标题字段的名称时才有效。我正在寻找一种方法来获取所有标题字段名称以枚举每个字段,但我没有找到任何方法来做到这一点。

我编写了一个 REST datasnap 控制台应用程序,并希望将所有 HTTP 请求/响应记录到控制台。

【问题讨论】:

    标签: delphi delphi-xe2


    【解决方案1】:

    AFAIK 这是不可能的(Delphi XE2)。

    我使用了一些小技巧来访问原始标题。 但是,这真的很脏!使用风险自负!

    实际的类请求类是 TIdHTTPAppRequest(警告:不同类型的 webbroker 应用程序可能会有所不同。我没有使用不同类型的数据快照应用程序测试此代码)。

    所以诀窍是:

    声明一个类似于以下的类助手:

      TIdHTTPAppRequestHelper = class helper for TIdHTTPAppRequest
      public
        function GetRequestInfo: TIdEntityHeaderInfo;
      end;
    
      implementation
    
      function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo;
      begin
        Result := FRequestInfo;
      end;
    

    通过这种方式,您可以使用此帮助程序来访问受保护的 FRequestInfo 字段。

    在 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 不允许读取原始标头是很糟糕的。那应该改变!

    【讨论】:

    • 如果您使用的是没有 Helpers 的旧版 Delphi,由于 FRequestInfo 受到保护,您可以从 TIdHTTPAppRequest 继承并将 GetRequestInfo 方法添加到新类中。与 Helper 版本有相同的注意事项。
    • Delphi 10.2 中仍未修复
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多