Indy IdHttp获取请求delphi

时间:2016-01-02 06:17:27

标签: delphi idhttp

我在使用约Idhttp.Get方法时遇到了一些问题。我认为它默认工作在阻塞模式(等待答案转到下一行),但我只是看到它不等待答案转到另一行。我正在使用它与线程,但我认为这不是问题。代码是:

  PbxURL = http://www.biyiklikadin.com;

  IdHTTP1:= TIdHttp.Create(Application);
  IdHTTP1.ConnectTimeout:= 10000;
  IdHTTP1.Request.Clear;
  IdHTTP1.Request.BasicAuthentication:= true;
    try
      IdHTTP1.Get(PbxURL); **//this should STOP here and wait for answer don't?**
      HttpCode:= IdHTTP1.ResponseCode;
    except
      on E: EIdHTTPProtocolException do
        HttpCode := IdHTTP1.ResponseCode;
    end;
    if HttpCode=200 then
      Memo1.Lines.Append('Kızlık Bozma');

所以,我只是注意到我没有得到正确的HttpCode值,因为在'Get'方法之后,它只是继续执行而不等待'Get'完成。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

Indy使用阻塞套接字调用,并执行阻塞操作。如果发生错误,方式TIdHTTP.Get()将不会等待响应。您只捕获一种类型的错误(服务器错误),但可能会发生其他类型的错误(套接字错误,内存/ rtl错误等)。并且无需测试响应代码以了解Get()是成功还是失败。引发异常的事实意味着它失败了。

try
  IdHTTP1.Get(PbxURL);
  // succeessful
except
  on E: EIdHTTPProtocolException do begin // <-- only raised if the server sends an error reply
    // do something...
  end;
  on E: Exception do begin // <-- any other error
    // do something else ...
  end;
end;

另外,您说您在线程中使用此代码。您对ApplicationMemo1的使用不是线程安全的。取消Application作为所有者,改为使用nil所有者,Free()使用TIdHTTP。并使用TThread.Synchronize() / TThread.Queue()TIdSync / TIdNotify或任何其他线程间通信方法安全地更新备忘录。 TIdAntiFreeze对在主UI线程之外执行的Indy操作没有影响。

答案 1 :(得分:2)

Indy 阻止。从可下载的文档here(Indy10.pdf):

  

Indy使用阻塞套接字调用。 ...例如,简单地连接   调用connect方法并等待它返回。如果成功,那就是   它会在它返回时返回。如果失败,则会引发异常。

在评论中,有人认为TIdAntiFreeze可能会影响Indy电话的阻止性质。再次来自文档:

  

Indy有一个解决用户界面冻结的特殊组件   透明的问题。只需在您的任何位置添加一个TIdAntiFreeze即可   应用程序,您可以在您的应用程序中执行标准阻止Indy调用   没有冻结用户界面的程序。

     

TIdAntiFreeze通过内部超时调用堆栈来工作   并在超时期间调用Application.ProcessMessages。 外部   对Indy的调用继续阻止,因此完全没有a   否则TIdAntiFreeze 。使用TIdAntiFreeze可以满足所有需求   阻塞插座的优点,没有最突出的   缺点

您的问题没有为进一步分析提供足够的信息。