使用Indy在Delphi 5中下载CSV

使用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

我知道有很多印第线程,但我找不到一个匹配我的情况

我得到了一个带有用户名和密码表单的URL。然后,此操作将指向一个URL/reports.php,该URL/reports.php上有多个超链接

每个链接都将指向一个带有URL变量的页面,例如reports.php?report=variablename,下载将立即开始

到目前为止,我的想法是:

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
对象,但从未释放它。