0

多くの Indy スレッドがあることは知っていますが、自分のケースに一致するスレッドを取得できません。

ユーザー名とパスワードのフォームが記載された URL を受け取りました。これは、複数のハイパーリンクがある URL/reports.php に対して動作します。

これらの各リンクは、reports.php?report=variablename などの URL 変数を含むページに移動し、ダウンロードがすぐに開始されます。

これまでの私の考え:

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 にアクセスするだけでよいですか、それとも Cookie を使用する必要がありますか?

ありがとう

4

2 に答える 2

2

あなたのコードにはいくつかのバグがあります:

1) PostData()HTTPS URL を要求していますが、SSL 対応の IOHandler をTIdHTTP.IOHandlerプロパティに割り当てていません。そうする必要があります。

2)は、プロトコルを指定しないButton1Click()URL を に渡しているため、その URL は既存の URL に関連するものとして扱われるため、 の代わりにからダウンロードしようとします。相対 URL を要求する場合は、ホスト名 (または、この場合はパスも含めないでください。同じパスに複数の要求を送信しているため、異なるドキュメントだけです)。GetUrlToFile()TIdHTTPhttps://www.testurl.com/test/testurl.com/test/reports.phphttps://testurl.com/test/reports.php

3) TIdHTTP オブジェクトをリークしています。

于 2011-10-26T00:36:13.787 に答える
0

問題 1) は別の投稿で解決されました: Delphi 5 Indy/ics SSL 回避策?

ただし、次のように、残りの部分について助けていただければ幸いです。

同じ IdHTTP オブジェクトと追加の URL 変数を使用して GET 呼び出しを行う必要がありますか? または、新しい IdHTTP オブジェクトを作成する必要がありますか?

Cookie を使用してセッションを記録する必要がありますか、それともすべて同じ呼び出しで行うことができますか?

上記のGET呼び出しは、実際にcsvをファイルに保存するために必要なものですか? とにかくデータをインポートする必要があるため、直接処理することもできます。

現在、コードは次のエラーを受け取ります: EIdHTTPProtocolException

于 2011-10-26T15:32:05.247 に答える