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.
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.
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;
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;