Скачать CSV в Delphi 5 с Indy - PullRequest
       35

Скачать CSV в Delphi 5 с Indy

0 голосов
/ 26 октября 2011

Я знаю, что есть много потоков Indy, но я не могу найти ни одного, соответствующего моему делу.

Мне дали URL с именем пользователя и паролем.Затем он выполняет действия с URL / reports.php, на который имеется несколько гиперссылок.

Каждая из этих ссылок будет перенаправлять на страницу с переменными URL, например, report.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 is not valid».Очевидно, я не публикую правильно на начальной странице, но кто-нибудь может посоветовать мне, что я пропускаю?Также я могу просто нажать URL для загрузки после входа в систему или мне нужно будет использовать куки?

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 октября 2011

В вашем коде есть несколько ошибок:

1) PostData() запрашивает URL-адрес HTTPS, но не присваивает IOHandler с включенным SSL свойству TIdHTTP.IOHandler. Вы должны сделать это.

2) Button1Click() передает URL-адрес GetUrlToFile(), который не указывает какой-либо протокол, поэтому TIdHTTP завершит обработку этого URL-адреса относительно его существующего URL-адреса и, таким образом, попытается вместо этого загрузить из https://www.testurl.com/test/testurl.com/test/reports.php https://testurl.com/test/reports.php. Если вы хотите запросить относительный URL-адрес, не включайте имя хоста (или даже путь в этом случае, поскольку вы отправляете несколько запросов на один и тот же путь, просто разные документы).

3) у вас есть объект TIdHTTP.

0 голосов
/ 26 октября 2011

Проблема 1) теперь решена в другом посте: Delphi 5 Indy / ics SSL обходной путь?

Однако я был бы очень признателен за остальную помощь, как показано ниже.

Нужно ли мне делать вызов GET с тем же объектом IdHTTP и дополнительной переменной URL? или я должен создать новый объект IdHTTP?

Нужно ли мне записывать сеанс с использованием файлов cookie или все это можно сделать одним и тем же звонком?

Действительно ли приведенный выше вызов GET необходим для сохранения файла csv в файл? Я также могу решить обработать его напрямую, так как в любом случае данные нужно будет импортировать.

В настоящее время код получает ошибку: EIdHTTPProtocolException

...