我过去常常在德尔福使用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能够填充第二个备忘录框。
答案 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中运行良好。它不是基于组件的框架,因此很容易与其他线程技术一起使用(例如OmniThreadLibrary或AsyncCalls)。
答案 3 :(得分:0)
Iirc如果网站重定向,你还需要覆盖一些处理程序(onredirect左右)。但在indy9 iirc中也是如此。
答案 4 :(得分:0)
这个问题已经持续了很长时间,所以我正在关闭它。我的解决方案是使用Synapse,正如其中一张海报所建议的那样。它适用于Windows / Linux / Mac OS,只需要很少的修改,并且可以在库/线程中正常工作。