web-dev-qa-db-fra.com

Comment faire un HTTPS POST demande à Delphes?

Quel est le moyen le plus simple de faire une demande HTTPS POST dans Delphi? Les requêtes HTTP POST ne posent pas de problème, mais comment puis-je le faire avec SSL? J'ai cherché sur Google et rien trouvé qui explique cela assez bien.

Voici le code que j'ai essayé:

procedure TForm1.FormCreate(Sender: TObject);
var
  responseXML:TMemoryStream;
  responseFromServer:string;
begin
  responseXML := TMemoryStream.Create;
  IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(self);
  with idSSLIOHandlerSocketOpenSSL1 do
    begin
      SSLOptions.Method := sslvSSLv2;
      SSLOptions.Mode := sslmUnassigned;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
      Host := '';
    end;

  IdHTTP1 := TIdHTTP.Create(Self);
  with IdHTTP1 do
    begin
      IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      AllowCookies := True;
      ProxyParams.BasicAuthentication := False;
      ProxyParams.ProxyPort := 0;
      Request.ContentLength := -1;
      Request.ContentRangeEnd := 0;
      Request.ContentRangeStart := 0;
      Request.Accept := 'text/html, */*';
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;
  responsefromserver := IdHTTP1.Post('https://.../','name1=value1&name2=value2&....');
end;

Lorsque j'essaie de l'exécuter, l'erreur suivante apparaît:

Project myProject.exe raised exception class EFOpenError with message 'Cannot open file "C:\...\Projects\Debug\Win32\name1=value1name2=value2 The system cannot find the file specified'.

Je ne comprends pas ça. J'ai envoyé des paramètres, bien que les erreurs sonnent comme si j'avais envoyé un fichier.

De plus, j'ai inclus libeay32.dll et ssleay32.dll dans mon dossier myProject.exe.

17
Peacelyk

Vous n'avez pas spécifié votre version Delphi ou votre version indy, mais j'avais déjà eu quelques problèmes avec Indy avec Delphi 2009 et HTTPS, et lorsque j'ai obtenu le dernier code source de indy svn , le problème a été résolu.

3
Mohammed Nasman

http://chee-yang.blogspot.com/2008/03/using-indy-https-client-to-consume.html

var S: TStringList;
   M: TStream;
begin
 S := TStringList.Create;
 M := TMemoryStream.Create;
 try
   S.Values['Email'] := 'your google account';
   S.Values['Passwd'] := 'your password';
   S.Values['source'] := 'estream-sqloffice-1.1.1.1';
   S.Values['service'] := 'cl';

   IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
   IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
   IdHTTP1.Post('https://www.google.com/accounts/ClientLogin', S, M);
   Memo1.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
   Memo1.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));

   M.Position := 0;
   S.LoadFromStream(M);
   Memo1.Lines.AddStrings(S);
 finally
   S.Free;
   M.Free;
 end;

fin;

2
k.bon

Une autre alternative à Indy est Synapse .

Cette bibliothèque de classes offre un contrôle total sur le courrier, mais offre également une méthode simple de poste simple:

function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
0
Darian Miller