TIdHTTP в Индии 10 - PullRequest
       35

TIdHTTP в Индии 10

2 голосов
/ 16 ноября 2009

Я использовал 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. Всегда возможно, что есть ошибка в комбинации компилятора / OS / Indy, который я использую. (Хотя должно работать).

Я должен отметить, что я всегда получаю всплывающее окно "Соединение закрыто изящно". Это кажется исключением, и это может повлиять на результат функции. Я попытался поймать это в ловушку с помощью ПОПРОБУЙ ... НАКОНЕЦ, но это не сработало. Возможно, потому что Indy вызывает исключение в фоновом режиме после запуска метода Get, я полагаю.

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

Ответы [ 5 ]

4 голосов
/ 16 ноября 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;
2 голосов
/ 16 ноября 2009

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

uses
  ...,HTTPSEND;

var
  Result : TStrings;


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

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

2 голосов
/ 16 ноября 2009

Необходимо установить для свойства HandleRedirects значение true.

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

var
  IdHTTP: TIdHTTP;

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

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

0 голосов
/ 03 марта 2011

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

0 голосов
/ 16 ноября 2009

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

...