2

我曾经在 Delphi 6 天使用 Indy,现在我正在使用 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. 我是否一开始就这样做了(或者我错过了什么?)。2. 如果是这样,为什么它不起作用。3. 我使用的compiler/os/Indy组合总是有可能存在bug。(虽然它应该工作)。

我应该提一下,我总是会弹出“连接正常关闭”。这似乎是一个例外,它可能会干扰函数的结果。我试图用 TRY...FINALLY 来捕捉它,但它不起作用。我想可能是因为 Indy 在 Get 方法运行后在后台触发了异常。

最后,这里是运行程序的截屏视频,以消除任何混淆: http://screencast.com/t/NDMzNTQ5 我希望 HTML 能够填充第二个备忘录框。

4

5 回答 5

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;
于 2009-11-16T15:54:06.880 回答
2

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

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

var
  IdHTTP: TIdHTTP;

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

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

于 2009-11-16T15:49:46.513 回答
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)一起使用。

于 2009-11-16T17:11:19.890 回答
0

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

于 2009-11-16T15:45:23.590 回答
0

这个问题已经存在了很长一段时间,所以我将其关闭。正如其中一位海报所建议的那样,我的解决方案是只使用 Synapse。它可以在 Windows/Linux/Mac OS 上进行最少的修改,并且可以在库/线程中正常工作。

于 2011-03-03T02:33:11.250 回答