Перечислите поля заголовка HTTP TWebRequest - PullRequest
5 голосов
/ 29 декабря 2011

возможно ли сбросить все поля заголовка объекта TWebRequest (и TWebResponse)?На данный момент я использую GetFieldByName () и печатаю их с помощью Writeln (), но это работает, только если я уже знаю имя поля заголовка.Я ищу способ получения всех имен полей заголовков для перечисления каждого поля, но я не нашел никакого способа сделать это.

Я написал консольное приложение REST datasnap и хочу регистрировать все HTTP-запросы /ответы на консоль.

1 Ответ

6 голосов
/ 29 декабря 2011

AFAIK не возможно (Delphi XE2).

Я использовал маленький брелок для доступа к необработанным заголовкам. Тем не менее, это действительно грязно! Используйте на свой страх и риск!

Фактическим классом запроса класса является TIdHTTPAppRequest (ВНИМАНИЕ: может отличаться для разных типов приложений веб-брокера. Я не тестировал этот код с разными видами приложений для сбора данных).

Итак, хитрость:

Объявите вспомогательный класс, подобный следующему:

  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 не позволяет читать необработанные заголовки. Это должно быть изменено!

...