Delphi 枚举TWebRequest HTTP头字段

Delphi 枚举TWebRequest HTTP头字段,delphi,delphi-xe2,Delphi,Delphi Xe2,是否可以转储TWebRequest(和TWebResponse)对象的所有头字段? 目前,我使用GetFieldByName()并使用Writeln()打印它们,但这只有在我已经知道头字段的名称时才起作用。我正在寻找一种方法来获取所有头字段名称,以枚举每个字段,但我没有找到任何方法来做到这一点 我编写了一个REST datasnap控制台应用程序,希望将所有HTTP请求/响应记录到控制台。AFAIK这是不可能的(Delphi XE2) 我使用了一些小技巧来访问原始标题。 然而,这真的很肮脏!使用

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

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

AFAIK这是不可能的(Delphi XE2)

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

实际的类请求类是TIdHTTPAppRequest(警告:对于不同类型的webbroker应用程序可能不同。我没有使用不同类型的datasnap应用程序测试此代码)

因此,诀窍在于:

声明类似于以下内容的类帮助器:

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

  implementation

  function TIdHTTPAppRequestHelper.GetRequestInfo: TIdEntityHeaderInfo;
  begin
    Result := FRequestInfo;
  end;
通过这种方式,您可以使用此帮助程序访问受保护的FrequesInfo字段

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

如果您使用的是没有帮助程序的旧版本Delphi,因为FRequestInfo受保护,您可以从TIdHTTPAppRequest继承并将GetRequestInfo方法添加到新类中。与帮助程序版本具有相同的注意事项。在Delphi10.2中仍然没有修复