0

我知道有很多 Indy 线程,但我找不到与我的情况相匹配的线程。

我收到了一个带有用户名和密码表单的 URL。然后对有多个超链接的 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 还是必须使用 cookie?

谢谢

4

2 回答 2

2

您的代码中有几个错误:

1)PostData()正在请求一个 HTTPS URL,但它没有将启用 SSL 的 IOHandler 分配给该TIdHTTP.IOHandler属性。你需要这样做。

2)Button1Click()正在传递一个GetUrlToFile()未指定任何协议的 URL,因此TIdHTTP最终会将该 URL 视为相对于其现有 URL,因此尝试从而https://www.testurl.com/test/testurl.com/test/reports.php不是https://testurl.com/test/reports.php. 如果您想请求相对 URL,请不要包含主机名(在这种情况下甚至不要包含路径,因为您将多个请求发送到同一路径,只是不同的文档)。

3)您正在泄漏 TIdHTTP 对象。

于 2011-10-26T00:36:13.787 回答
0

问题 1) 现在已在另一篇文章中得到解决: Delphi 5 Indy/ics SSL workaround?

但是,我将非常感谢其他方面的帮助,如下所示。

我是否需要使用相同的 IdHTTP 对象和其他 URL 变量进行 GET 调用?还是我应该创建一个新的 IdHTTP 对象?

我是否需要使用 cookie 记录会话,或者所有这些都可以通过同一个调用完成?

上面的 GET 调用实际上是我需要将 csv 保存到文件吗?我也可以选择直接处理它,因为无论如何数据都需要导入。

目前代码收到错误:EIdHTTPProtocolException

于 2011-10-26T15:32:05.247 回答