Indy IdHttp获取请求delphi

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

关于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'完成。我怎样才能解决这个问题?

印第正在阻塞。从可下载的文件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看到我的答案。嘿,你在偷我的答案@贞操;你注意到了吗?现在,对印地的外部电话继续封锁,是吗?嘿,你在偷我的答案@贞操;你注意到了,现在对印地的外部呼叫继续阻塞,…,是吗?