Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Переконект в IdHttp


Автор: BeePer 19.2.2006, 01:46
Вобщем, есть компонет idhttp.. Один раз выполняет GET/POST запросы на ура, но если в этом же коде (напр Button1.Click) задать ещё один запрос, то прога виснет, а потом выдаёт ошибку, таймаута подключение (типа того что время ожидания закончилось), заметил, что второй раз он пытается приконектиться на локальный йп-шник, а не тот что в коде...
Вот и вопрос: как такое исправить? Кто-нить знает?

И тут же по теме ещё один вопросик:

Код

 http:=TIdHTTP.Create(Self);
  ms := TMemoryStream.Create;
 try
 url := 'http://site.net/scr?123';
    http.Get(img, ms);
Выполняется нормально, а вот такой:
Код

{тоже самое}
url := ss;  //ss : string, та же ссылка, но предварительно выдранная из html
{тоже самое}
Уже не хочет, в чём загвоздка?

Автор: Snowy 19.2.2006, 09:38
Это обычная загвоздка 9-й Indy.
После отключения, контрол повторному использованию не подлежит.
Создал, использовал, уничтожил. И т.д.
Посмотри поиском по TIdHTTP - во всех примерах я всегда его создаю и уничтожаю.

Автор: Демо 19.2.2006, 12:44
Snowy,

Писал я повторно используемый код в Indy9, но сейчас уже не проверить, Indy9 уже нет.
К сожалению, на Indy нельзя писать проеты, имеющие долгий срок жизни, так как любая следующая версия несовместима с ююбой предыдущей. А бывают критические ошибки, когда просто необходимо перейти на следущую версию, что приведет к переделке всего проекта.

Автор: BeePer 19.2.2006, 17:10
Я не в курсе, уничтожать idhttp, это free или destroy?
И после уничтожения.. При создании нового ему надо уже другое имя давать или можно тоже?

Ещё:
Код

http.Get('http://site.net/df?123', ms);
конектится к указанному адресу, а
Код

url:='http://site.net/df?123';
http.Get(url, ms);
начинает конекттиться к локалхосту, и естественно выдаёт ошибку таймаута.. Я так и не понял, как такое исправить?

Автор: Snowy 19.2.2006, 17:23
http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=75664f072e00dcffe8dc8ff290413f87&search_in=posts&result_type=topics&flag=search&debug=&highlite=idhttp%5C.get&skipped=

Автор: BeePer 19.2.2006, 20:26
Так, вроде понял.. уничтожение - это free, ничего по вопросу создания нового компонента не нашёл.. ну ладно сам допру..

Но остался ещё один вопрос:
Код

begin
     Memo1.Text   := idhttp1.Get('http://link');
     idhttp1.Free;
{работаем с ответом}
    http:=TIdHTTP.Create(Self);
    ms := TMemoryStream.Create;
  try
    http.Get('http://link', ms);
    ms.Position := 0;
{работаем с ответом}
  finally
    ms.Free;
    http.Free;
  end;
 end;

Первый раз код отрабатывает хорошо, но запустив его ещё раз (нажав кнопку), выдаёт ошибку "Access violation"..
Я так понял, что удаляется какой-то компонент, а при повторном запуске он не создаётся.. но какой и где не знаю..?
Посмотрите, здесь может быть ошибка? или это из-за другого чего-то?

з.ы. не надо меня в поиск посылать, я им сам пробовал, но ничего не нашёл..

Автор: Snowy 20.2.2006, 10:17
Вообще убери IdHTTP1 с формы.
Объяви его, как локальную переменную в процедуре.
И еще. Нельзя уничтожить объект второй раз.
Сначала создавай, потом уничтожай, но не наоборот.
У тебя он сначала уничтожается, потом создается, потом опять уничтожается.
Вполне понятно, что при втором запуске ты пытаешься уничтожить уже несуществующий объект.
Получаешь ошибку.
Добавлено @ 10:20
Код

var
  http: TIdHTTP;
begin
  http:=TIdHTTP.Create(Self);
  ms := TMemoryStream.Create;
  try
    http.Get('http://link', ms);
    ms.Position := 0;
    Memo1.Lines.LoadFromStream(ms);
{работаем с ответом}
  finally
    ms.Free;
    http.Free;
  end;
end;
А на форму его вообще класть не нужно.

Автор: BeePer 20.2.2006, 21:22
Snowy спасиб, те.. получилось))
Осталось два вопроса:
Код

http.Get('http://link', ms);

и
Код

u:='http://link';
http.Get(u, ms);
Оба кода работают нормально, а такой:
Код

{get'аем страничку, парсим, выцепляем url}
//цикл  
u:= memo1.Lines[st];
   ps:= Pos('http://link', u);
    if ps<>0 then begin
    u := copy(u, ps, 10);
http.Get(u, ms);
Уже перестаёт работать (конектится к локалхосту почему-то.. Почему не знаешь?

Спустя несколько часов....
Всё)) Сам сделал:
Код

{get'аем страничку, парсим, выцепляем url}
//цикл 
 u:= memo1.Lines[st];
   ps:= Pos('http://link', u);
    if ps<>0 then begin
    u := copy(u, ps, 10);
url:=u;
http.Get(url, ms);
Правда не знаю почему с заменой переменной работает, кто знает, отпишитесь - охота узнать, а
так тему мона закрывать, вопрос решён))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)