使用Indy在Delphi 5中下载CSV
我知道有很多印第线程,但我找不到一个匹配我的情况 我得到了一个带有用户名和密码表单的URL。然后,此操作将指向一个URL/reports.php,该URL/reports.php上有多个超链接 每个链接都将指向一个带有URL变量的页面,例如reports.php?report=variablename,下载将立即开始 到目前为止,我的想法是:使用Indy在Delphi 5中下载CSV,delphi,post,indy,delphi-5,Delphi,Post,Indy,Delphi 5,我知道有很多印第线程,但我找不到一个匹配我的情况 我得到了一个带有用户名和密码表单的URL。然后,此操作将指向一个URL/reports.php,该URL/reports.php上有多个超链接 每个链接都将指向一个带有URL变量的页面,例如reports.php?report=variablename,下载将立即开始 到目前为止,我的想法是: procedure TForm1.PostData(Sender: TObject); var paramList:TStringList; ur
procedure TForm1.PostData(Sender: TObject);
var
paramList:TStringList;
url,text:string;
// IdHTTP1: TIdHTTP;
IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
idLogFile1 : TidLogFile;
begin
idLogFile1 := TidLogFile.Create(nil);
with idLogFile1 do
begin
idLogFile1.Filename := 'C:\HTTPSlogfile.txt';
idLogFile1.active := True;
end;
IdHTTP1 := TIdHTTP.Create(nil);
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocket.Create(nil);
IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23;
IdHTTP1.IOHandler := IdSSLIOHandlerSocket1;
IdHTTP1.HandleRedirects := true;
IdHTTP1.ReadTimeout := 5000;
IdHTTP1.Intercept := idLogFile1;
paramList:=TStringList.create;
paramList.Clear;
paramList.Add('loguser=testuser');
paramList.Add('logpass=duke7aunt');
paramList.Add('logclub=8005');
url := 'https://www.dfcdata.co.uk/integration/reports.php?report=live';
try
IdHTTP1.Post(url,paramList);
except
on E:Exception do
begin
showMessage('failed to post to: '+url);
ShowMessage('Exception message = '+E.Message);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
reportType : String;
begin
PostData(Self);
reportType := 'live';
GetUrlToFile('',reportType+'.csv');
end;
procedure TForm1.GetUrlToFile(AURL, AFile : String);
var
Output : TMemoryStream;
success : Boolean;
begin
success := True;
Output := TMemoryStream.Create;
try
try
IdHTTP1.Get(AURL, Output);
IdHTTP1.Disconnect;
except
on E : Exception do
begin
ShowMessage('Get failed to GET from '+IdHTTP1.GetNamePath +'. Exception message = '+E.Message);
success := False;
end;
end;
if success = True then
begin
showMessage('Filed saved');
Output.SaveToFile(AFile);
end;
finally
Output.Free;
end;
end;
每次尝试都会出现“IOHandler无效”错误。很明显,我没有正确地发布到初始页面,但是有人能告诉我我缺少了什么吗?我也可以在登录后点击下载URL,还是必须使用cookies
谢谢您的代码中有几个错误: 1)
PostData()。你需要这样做
2) Button1Click()
正在将URL传递给没有指定任何协议的GetUrlToFile()
,因此tidhp
最终将该URL视为与其现有URL相对应,因此,请尝试从https://www.testurl.com/test/testurl.com/test/reports.php
而不是https://testurl.com/test/reports.php
。如果要请求相对URL,请不要包含主机名(本例中甚至包括路径,因为您要向同一路径发送多个请求,而只是发送不同的文档)
3) 您正在泄漏TIdHTTP对象。问题1)现已在另一篇文章中得到解决:
不过,我将非常感谢其他方面的帮助,如下所示
我是否需要使用相同的IdHTTP对象和额外的URL变量进行GET调用?或者我应该创建一个新的IdHTTP对象吗
我是否需要使用Cookie记录会话,或者所有这些都可以通过同一个呼叫完成
上面的GET调用实际上是我保存csv文件所需要的吗?我也可以选择直接处理它,因为数据无论如何都需要导入
目前代码出现错误:EIdHTTPProtocolException谢谢Remy,很抱歉有很多新问题。1) 我分配了TIdHttp1.IOHandler:=IdSSLIOHandlerSocket1,但随后出现错误“无法加载SSL库”。我附加了一个TIdHttp1.Intercept:=IdLogFile,它只显示“Stat Disconnected.”2)您是否建议我使用GetUrlToFile('/reports.php?report=variable','test.csv')?3) 你说的泄漏物体是什么意思@Remy Lebeau-TeamBIt显示我的错误可能是由于错误的SSL DLL造成的。我正在使用D5中最新的Indy9库。我加载了dpk并删除了所有组件,下载了最新的10,运行了Fulld5.bat。我不知道这是否是正确的升级方式,但我收到各种消息说IndyProtocols50不使用或支持IdSSLOpenSSLHeaders和IdSSLOpenSSL,IndyX509。这似乎是D5的问题。我将重新发帖,因为这是一个不同的问题:感谢1)SSL加载错误通常意味着您使用了错误的OpenSSL DLL。Indy 9不支持官方DLL,它需要定制DLL。这是印地安10号修正的。2) 不,我的意思是GetUrlToFile('reports.php?…')
。3) 你从没听说过内存泄漏吗?您正在创建一个新的TIdHTTP
对象,但从未释放它。