При Get запросе зависает программа

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by wildfires, 11 Aug 2012.

  1. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, написал программу, воде бы работает, но иногда зависает при Get запросе к некоторым сайтам, один из таких сайтов http://www.sura-expert.ru/
    Пробовал просто сделать Get запрос к этой странице и вывести исходный код в Label, но всеравно зависает, в чем может быть причина и как это можно исправить ?
    Или вот еще на этой ссылке www.bgct.ru зависает.
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Какой язык программирования и что используете для работы с HTTP?
     
  3. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Chrome, делфи, инди.
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Используйте компонент IdAntiFreeze, или выполняйте запросы из дополнительного потока.
     
  5. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    IdAntiFreeze использую, без него прога зависала сразу, но работала, но опять же то этих сайтов, когда добавил этот компонент, программа сразу перестала зависать, но когда доходит до этих сайтов - зависает.

    с этим к сожалению не знаком, сейчас буду гуглить, спасибо.
     
  6. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Гугли свойства idhttp ConnectTimeout и ReadTimeout.
     
  7. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Ставил и ConnectTimeout и ReadTimeout по 10 секунд, не помогло, да и сайты вроде с бразера быстро загружаются.
     
  8. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Смотри заголовки, параметры запроса и тд...
    З.Ы. по истечению времени обычный try except не определит. Нужно обрабатывать так:
    PHP:
    begin
       http
    .ConnectTimeout := 1;
       
    http.ReadTimeout := 1;
          try
            
    Memo1.Lines.Text := http.Get('http://ya.ru');
          
    except
           on EIdConnectTimeout 
    do ShowMessage('fuck');
           
    on EIdReadTimeout do ShowMessage('fuck');
       
    end;
    end;
    Попробуй обновить либу инди на более новую. Только в последних нужно писать:
    HTTP.IOHandler.ReadTimeout
    HTTP.IOHandler.ConnectTimeout
     
    #8 shadowrun, 11 Aug 2012
    Last edited: 11 Aug 2012
  9. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Ну вот мой весь код:
    Code:
    procedure TForm2.Button2Click(Sender: TObject);
    begin
    f:=TStringList.Create();
    f.LoadFromFile('base.txt');
    n:=f.count;
    s:=n;
    Label1.Caption:=inttostr(s);
    f1:=Tstringlist.Create();
    f1.LoadFromFile('good.txt');
    f2:=Tstringlist.Create();
    f2.LoadFromFile('nogood.txt');
    IdHTTP1.HandleRedirects:=True;
    for i:= 0 to n-1 do
    begin
    idhttp1.connecttimeout:=10000;
    idhttp1.readtimeout:=10000;
    try
    IdHTTP1.Get(f.Strings[i]);
    f2.Add(d);
    f2.SaveToFile('nogood.txt');
    except
    f1.Add(d);
    f1.SaveToFile('good.txt');
    end;
    s:=s-1;
    Label1.Caption:=inttostr(s);
    end;
    end;
    
    
    
    
    procedure TForm2.IdHTTP1Redirect(Sender: TObject; var dest: string;
      var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
    begin
    d:=IdHTTP1.Response.Location;
    end;

    shadowrun, спасибо, сейчас попробую.
     
  10. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Code:
    AIdHTTP.OnWork := AIdHTTPWork;
    //...
    procedure AIdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    begin
      Application.ProcessMessages;
    end;
     
  11. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    ADR-007, компилятор ругается на строку:
    IdHTTP.OnWork := AIdHTTPWork;
    E2009 Incompatible types: 'method pointer and regular procedure'
     
  12. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Процедура AIdHTTPWork должна быть методом класса. Объяви ее в public пространстве своей формы, например.
     
  13. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Объявил, теперь ошибка:
    E2065 Unsatisfied forward or external declaration: 'TForm2.AIdHTTPWork'
     
  14. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    А объявление процедуры с
    Code:
    procedure AIdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    на
    Code:
    procedure TForm2.AIdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    заменил?
     
  15. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Chrome~, сейчас заменил, программа запустилась, но все равно зависает на этих сайтах. Ничего не помогает.
     
  16. wildfires

    wildfires New Member

    Joined:
    2 Dec 2011
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Может есть какой то другой способ, получить ссылки после редиректа ?
     
  17. Cherep

    Cherep New Member

    Joined:
    30 May 2010
    Messages:
    158
    Likes Received:
    1
    Reputations:
    -10
    После редиректа, в респонс хедерс, в локейшене будет ссыль вроде, куда отредиректит
     
  18. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Code:
      TIdHTTPRedirectHelper = class helper for TIdHTTP
        function GetWithRedirect(URL: string; MaxRedirectCount: Integer = 10): string;
        procedure HeadWithRedirect(URL: string; MaxRedirectCount: Integer = 10);
      end;
    
    { TIdHTTPRedirectHelper }
    
    function TIdHTTPRedirectHelper.GetWithRedirect(URL: string;
      MaxRedirectCount: Integer): string;
    var
      I: Integer;
    begin
      for I := 0 to MaxRedirectCount do
        try
          Result := Get(URL);
          Exit;
        except
          on E : EIDHttpProtocolException do
            if ((E.ErrorCode = 301) or (E.ErrorCode = 302))
              and (I < MaxRedirectCount)
            then
              URL := Response.Location
            else
              raise;
        end;
      URL := Response.Location;
    end;
    
    procedure TIdHTTPRedirectHelper.HeadWithRedirect(URL: string;
      MaxRedirectCount: Integer);
    var
      I: Integer;
    begin
      for I := 0 to MaxRedirectCount -1 do
        try
          Head(URL);
          Exit;
        except
          on E : EIDHttpProtocolException do
            if (E.ErrorCode = 301) or (E.ErrorCode = 302)
              and (I < MaxRedirectCount)
            then
              URL := Response.Location
            else
              raise;
        end;
      URL := Response.Location;
    end;
    
    думаю ясно как переделать...
     
  19. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    347
    Likes Received:
    17
    Reputations:
    0
    Мой совет дочитать книгу до конца... а затем уже браться за работу с HTTP протоколом.

    Вот я накидал примерчик Вам, комментил почти каждую строчку кода. Разбирайтесь. Удачи.
    Пароль: antichat
    Ссылка: _http://files.mail.ru/BZ0MW9



    P.S. По поводу редиректа.

    Code:
    http.handleredirect := false;
    try
    http.get(url);
    except
     // Копируем из HTTP.Response.RawHeaders.Text строку Location...
    end
    
     
    #19 Kandi, 15 Aug 2012
    Last edited: 15 Aug 2012
Loading...