是否可以转储TWebRequest(和TWebResponse)对象的所有头字段?
目前我使用GetFieldByName()并使用Writeln()打印它们,但这只有在我已经知道标题字段的名称时才有效.我正在寻找一种方法来获取所有标题字段名称来创建每个字段,但我没有找到任何方法来做到这一点.
目前我使用GetFieldByName()并使用Writeln()打印它们,但这只有在我已经知道标题字段的名称时才有效.我正在寻找一种方法来获取所有标题字段名称来创建每个字段,但我没有找到任何方法来做到这一点.
我编写了一个REST datasnap控制台应用程序,并希望将所有HTTP请求/响应记录到控制台.
解决方法
AFAIK它是不可能的(Delphi XE2).
我使用了一点trink来访问原始标题.
但是,这真的很脏!使用风险自负!
实际的类请求类是TIdHTTPAppRequest(警告:对于不同类型的webbroker应用程序可能有所不同.我没有使用不同类型的datasnap应用程序测试此代码).
所以诀窍是:
声明类似于以下的类助手:
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不允许读取原始标头是很糟糕的.那应该改变!