繁体   English   中英

Indy IdHttp获取请求delphi

[英]Indy IdHttp get request delphi

我在关于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”完成。 我怎么解决这个问题?

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的使用不是线程安全的。 TIdHTTP Application作为所有者,使用nil Owner代替,并在使用TIdHTTP Free() TIdHTTP 并使用TThread.Synchronize() / TThread.Queue()TIdSync / TIdNotify或任何其他线程间通信方法来安全地更新Memo。 TIdAntiFreeze对在主UI线程之外执行的Indy操作没有影响。

Indy 正在封锁。 此处可下载的文档(Indy10.pdf):

Indy使用阻塞套接字调用。 ...例如,要进行连接,只需调用connect方法并等待其返回即可。 如果成功,它将在成功时返回。 如果失败,将引发异常。

在评论中,有人建议TIdAntiFreeze可能会影响Indy调用的阻止性质。 再次从文档:

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

TIdAntiFreeze通过内部使对堆栈的调用超时并在超时期间调用Application.ProcessMessages来工作。 对Indy的外部调用将继续阻塞,因此与没有TIdAntiFreeze的情况完全一样 TIdAntiFreeze的使用具有阻塞套接字的所有优点,而没有最突出的缺点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM