Indy 10中的TIdHTTP

时间:2009-11-16 15:28:15

标签: delphi indy freepascal

我过去常常在德尔福使用Indy 6天,现在我正在玩Indy 10。我想要做的事情非常简单,但我没有看到一种简单的方法,所以我必须遗漏一些东西。

我想做的是这样的事情:

以下是我使用的实际代码:

procedure TForm1.btnGetURLClick(Sender: TObject);
begin
  moHeader.Lines.Clear;
  moBody.Lines.Clear;
  try
    moBody.text := IdHttp1.Get(edURL.text);
  finally
  end;
end;   

请求完成后,http_result应包含指定URL中的HTML。然而,这似乎不起作用,所以我觉得我应该使用IOHandler属性或组件的OnWork事件 - 但是对我来说用法似乎并不明显,我找不到任何有用的例子与谷歌。我确信这是以前做过的事情,所以任何帮助都会受到赞赏。

其他信息: 本着更具体的精神,我想知道: 1.我这样做是对吗(或者我错过了什么?)。 如果是这样,为什么它不起作用。 3.我正在使用的编译器/ os / Indy组合中总有可能存在错误。 (虽然应该有效)。

我应该提一下,我总是得到一个弹出“Connection Closed Gracefully”。这似乎是一个例外,它可能会干扰函数的结果。我尝试用TRY捕获它......最后,但它不起作用。可能是因为Indy在Get方法运行后在后台触发异常,我猜想。

最后,这是一个程序的截屏视图,用于清除任何混淆: http://screencast.com/t/NDMzNTQ5 我希望HTML能够填充第二个备忘录框。

5 个答案:

答案 0 :(得分:4)

我认为您已将TIdHTTP。 HandleRedirects 属性设置为false,如果您收到错误“HTTP/1.1 302 Found”,则可以尝试此操作

var
http_result:string;    
Begin
IdHTTP1.HandleRedirects:=True;
http_result := IdHTTP1.Get('http://www.google.com');

End;

答案 1 :(得分:2)

您必须将属性HandleRedirects设置为true。

不需要表单,使用GExperts组件编写代码我得到了这个:

var
  IdHTTP: TIdHTTP;

IdHTTP := TIdHTTP.Create(Self);
with IdHTTP do
begin
  Name := 'IdHTTP';
  AllowCookies := True;
  HandleRedirects := True;
  HTTPOptions := [hoForceEncodeParams];
end;

只需将其粘贴到您的单元中,就应该只需要它。

答案 2 :(得分:2)

另一种选择是使用synapse。这就是使用此库检索网页所需的全部内容:

uses
  ...,HTTPSEND;

var
  Result : TStrings;


  if HTTPGetText('http://www.google.com',Result) then
    // do something with result

Synapse是一个轻量级的TCPIP库。该库正在积极维护,当前版本在Delphi 2009/2010中运行良好。它不是基于组件的框架,因此很容易与其他线程技术一起使用(例如OmniThreadLibraryAsyncCalls)。

答案 3 :(得分:0)

Iirc如果网站重定向,你还需要覆盖一些处理程序(onredirect左右)。但在indy9 iirc中也是如此。

答案 4 :(得分:0)

这个问题已经持续了很长时间,所以我正在关闭它。我的解决方案是使用Synapse,正如其中一张海报所建议的那样。它适用于Windows / Linux / Mac OS,只需要很少的修改,并且可以在库/线程中正常工作。