Indy IdHttp获取请求delphi
关于Idhttp.Get方法,我遇到了一些问题。我以为它默认在阻塞模式下工作,等待答案转到下一行,但我只是看到它没有等待答案转到另一行。我在线程中使用它,但我认为这不是问题所在。代码是:Indy IdHttp获取请求delphi,delphi,idhttp,Delphi,Idhttp,关于Idhttp.Get方法,我遇到了一些问题。我以为它默认在阻塞模式下工作,等待答案转到下一行,但我只是看到它没有等待答案转到另一行。我在线程中使用它,但我认为这不是问题所在。代码是: PbxURL = http://www.biyiklikadin.com; IdHTTP1:= TIdHttp.Create(Application); IdHTTP1.ConnectTimeout:= 10000; IdHTTP1.Request.Clear; IdHTTP1.Reque
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'完成。我怎样才能解决这个问题?印第正在阻塞。从可下载的文件Indy10.pdf:
Indy使用阻止套接字调用。。。例如,简单地连接 调用connect方法并等待它返回。如果它成功了,它就会失败 当它返回时,将返回。如果失败,它将引发异常 在一篇评论中,有人提出,TID防冻剂可能会影响Indy呼叫的阻塞性。再次从文档中: Indy有一个解决用户界面冻结的特殊组件 问题是透明的。只需在身体的任何地方添加一滴防冻液 应用程序,并且您可以在 不冻结用户界面的程序 TID防冻剂通过内部超时调用堆栈来工作 以及在超时期间调用Application.ProcessMessages。外部 对Indy的调用将继续被阻塞,因此其工作方式与没有 否则,请不要使用防冻液。使用TID防冻剂可使所有 封堵插座的优点,无需最为突出 劣势 您的问题没有提供足够的信息供进一步分析。印第正在阻止。从可下载的文件Indy10.pdf:
Indy使用阻止套接字调用。。。例如,简单地连接 调用connect方法并等待它返回。如果它成功了,它就会失败 当它返回时,将返回。如果失败,它将引发异常 在一篇评论中,有人提出,TID防冻剂可能会影响Indy呼叫的阻塞性。再次从文档中: Indy有一个解决用户界面冻结的特殊组件 问题是透明的。只需在身体的任何地方添加一滴防冻液 应用程序,并且您可以在 不冻结用户界面的程序 TID防冻剂通过内部超时调用堆栈来工作 以及在超时期间调用Application.ProcessMessages。外部 对Indy的调用将继续被阻塞,因此其工作方式与没有 否则,请不要使用防冻液。使用TID防冻剂可使所有 封堵插座的优点,无需最为突出 劣势
您的问题没有提供足够的信息供进一步分析。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;
另外,您说您正在线程中使用此代码。您对应用程序和备忘录1的使用不是线程安全的。放弃应用程序作为所有者,改用nil所有者,并在使用完TIdHTTP后释放它。并使用TThread.Synchronize/TThread.Queue、TIdSync/TIdNotify或任何其他线程间通信方法安全地更新备忘录。TID防冻液对在主UI线程之外执行的Indy操作没有影响。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;
另外,您说您正在线程中使用此代码。您对应用程序和备忘录1的使用不是线程安全的。放弃应用程序作为所有者,改用nil所有者,并在使用完TIdHTTP后释放它。并使用TThread.Synchronize/TThread.Queue、TIdSync/TIdNotify或任何其他线程间通信方法安全地更新备忘录。TID防冻剂对在主UI线程之外执行的Indy操作没有影响。您的应用程序中是否有TID防冻剂组件在使用?我认为您的观察不正确。我得到了正确的、预期的响应代码。@Virustinity为什么您认为TIDTantifeze会影响对IdHTTP1.get的调用?我很确定它没有。@TomBrunberg…因为这个组件使Indy组件无阻塞,这符合问题。@Virustinity看到我的答案了。你有什么建议吗
TID在您的应用程序中某处使用了防冻剂成分?我认为您的观察是不正确的。我得到了正确的、预期的响应代码。@Virustinity为什么您认为TIDTantifeze会影响对IdHTTP1.get的调用?我很确定它没有。@TomBrunberg…因为这个组件使Indy组件无阻塞,这符合问题。@Virustinity看到我的答案。嘿,你在偷我的答案@贞操;你注意到了吗?现在,对印地的外部电话继续封锁,是吗?嘿,你在偷我的答案@贞操;你注意到了,现在对印地的外部呼叫继续阻塞,…,是吗?