TIdHTTP в Indy 10

Раньше я использовал Indy еще во времена Delphi 6, а сейчас играю с Indy 10. То, что я хочу сделать, невероятно просто, но я не вижу простого способа сделать это, поэтому я должен что-то упустить.

Я хочу сделать что-то вроде этого:

Вот фактический код, который я использую:

procedure TForm1.btnGetURLClick(Sender: TObject);
begin
  moHeader.Lines.Clear;
  moBody.Lines.Clear;
  try
    moBody.text := IdHttp1.Get(edURL.text);
  finally
  end;
end;   

Когда запрос завершен, http_result должен содержать HTML из указанного URL. Однако это, похоже, не работает, поэтому я чувствую, что, возможно, мне следует использовать свойство IOHandler или событие OnWork компонента, однако использование не кажется мне очевидным, и я не смог найти никаких рабочих примеров. с гугл. Я уверен, что это то, что было сделано раньше, поэтому любая помощь будет оценена.

Дополнительная информация: Чтобы быть более конкретным, я хочу знать: 1. Правильно ли я делаю это с самого начала (или я что-то упустил?). 2. Если да, то почему он может не работать. 3. Всегда возможно, что в комбинации компилятор/ОС/Инди, которую я использую, есть ошибка. (Хотя должно работать).

Я должен упомянуть, что я всегда получаю всплывающее окно «Соединение закрыто изящно». Кажется, это исключение, и оно может мешать результату функции. Я попытался поймать это с помощью TRY...FINALLY, но это не сработало. Вероятно, потому, что Indy вызывает исключение в фоновом режиме после запуска метода Get, я полагаю.

Наконец, вот скриншот работающей программы, чтобы не было путаницы: http://screencast.com/t/NDMzNTQ5 Я ожидаю, что HTML заполнит второе поле для заметок.


person Noah    schedule 16.11.2009    source источник
comment
Это должно работать. Может быть, вы можете показать часть, где вы создаете IdHTTP1. Я предполагаю, что если вы не используете форму, вы делаете это вручную в своем коде.   -  person jpfollenius    schedule 16.11.2009
comment
Добро пожаловать в Stack Overflow. Здесь, как и везде в жизни, когда вы говорите, что что-то не работает, нужно быть более конкретным. Что происходит, и что вы ожидали вместо этого?   -  person Rob Kennedy    schedule 16.11.2009
comment
На самом деле, я сейчас делаю это в форме для тестирования, я упоминал, что делаю это без компонента GUI, потому что в конечном итоге я планирую использовать его в библиотеке. Сейчас, конечно, я сосредоточен на том, чтобы заставить его работать.   -  person Noah    schedule 17.11.2009


Ответы (5)


Другой вариант — использовать синапс. Это все, что нужно для получения веб-страницы с помощью этой библиотеки:

uses
  ...,HTTPSEND;

var
  Result : TStrings;


  if HTTPGetText('http://www.google.com',Result) then
    // do something with result

Synapse — это облегченная библиотека TCPIP. Библиотека активно поддерживается, и текущая версия отлично работает в Delphi 2009/2010. Это НЕ компонентная структура, поэтому ее очень легко использовать с другими методами многопоточности (OmniThreadLibrary или AsyncCalls, например).

person skamradt    schedule 16.11.2009
comment
Я обязательно посмотрю на это. Я выбрал Indy, потому что был знаком с ним по много лет назад в Delphi 6 или около того. - person Noah; 17.11.2009
comment
Я заставил Synapse работать с небольшой работой (поддерживает FPK из коробки, но не на MacOS/BSD...). Я думаю, что это хороший вариант для моего использования, но я оставлю вопрос открытым немного дольше, поскольку ответ на него путем исправления Indy может помочь другим людям, которые позже ищут такой ответ. - person Noah; 17.11.2009

я думаю, у вас есть TIdHTTP.HandleRedirects установлено значение false, если вы получаете сообщение об ошибке "HTTP/1.1 302 Found", вы можете попробовать это

var
http_result:string;    
Begin
IdHTTP1.HandleRedirects:=True;
http_result := IdHTTP1.Get('http://www.google.com');

End;
person RRUZ    schedule 16.11.2009
comment
Привет, это действительно происходило. Теперь я изменил свойство HandleRedirects на true. Однако я все еще получаю: HTTP/1.1 302 Found. - person Noah; 17.11.2009
comment
302 — это редирект. TIdHTTP отлично справляется с этим, пока сервер предоставляет заголовок Location с новым URL-адресом. - person Remy Lebeau; 19.11.2009

Вы должны установить для свойства HandleRedirects значение true.

Нет необходимости в форме, используя компоненты GExperts для кода, я получил это:

var
  IdHTTP: TIdHTTP;

IdHTTP := TIdHTTP.Create(Self);
with IdHTTP do
begin
  Name := 'IdHTTP';
  AllowCookies := True;
  HandleRedirects := True;
  HTTPOptions := [hoForceEncodeParams];
end;

Просто вставьте это в свой блок, это должно быть все, что вам нужно.

person johnny    schedule 16.11.2009

Iirc, если веб-сайт перенаправляет, вам также необходимо переопределить какой-либо обработчик (onredirect или около того). Но так было и в indy9 iirc.

person Marco van de Voort    schedule 16.11.2009
comment
Я планирую использовать это с локальным демоном, поэтому перенаправления не будут проблемой, но вполне возможно, что они есть на данный момент, так как я тестировал с www.google.com и т. д. С другой стороны, я пока не могу заставить работать ни один сайт, что наводит меня на мысль, что я делаю это неправильно. - person Noah; 17.11.2009
comment
TIdHTTP по умолчанию обрабатывает перенаправления автоматически. Посмотрите на свойства HandleRedirects и RedirectMaximum. - person Remy Lebeau; 19.11.2009

Этот вопрос оставался открытым в течение довольно долгого времени, поэтому я закрываю его. Мое решение состояло в том, чтобы просто использовать Synapse, как предложил один из плакатов. Он работает в Windows/Linux/Mac OS с минимальными изменениями и отлично работает в библиотеках/потоках.

person Noah    schedule 03.03.2011