[英]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;
另外,您说您正在线程中使用此代码。 您对Application
和Memo1
的使用不是线程安全的。 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.