是否可以转储TWebRequest(和TWebResponse)对象的所有头字段? 目前我使用GetFieldByName()并使用Writeln()打印它们,但这只有在我已经知道标题字段的名称时才有效。我正在寻找一种获取所有标题字段名称以获取每个字段的方法,但我没有找到任何方法来执行此操作。
我编写了一个REST datasnap控制台应用程序,并希望将所有HTTP请求/响应记录到控制台。
答案 0 :(得分:6)
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不允许读取原始标头是很糟糕的。那应该改变!