2010-11-19 24 views
15

Qual è il modo più semplice per eseguire una richiesta POST HTTPS in Delphi? Non ho problemi con le richieste HTTP POST, ma come posso farlo usando SSL? Ho cercato su Google e non ho trovato nulla che lo spieghi abbastanza bene.Come effettuare una richiesta POST HTTPS in Delphi?

Ecco il codice che ho provato:

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; 

Quando provo a farlo funzionare io ottenere il seguente errore:

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

Non capisco questo. Ho inviato i parametri, anche se gli errori sembrano come se avessi inviato un file.

Inoltre ho incluso libeay32.dll e ssleay32.dll nella mia cartella myProject.exe.

+0

Hai mai trovato una soluzione per questo? –

risposta

3

Non hai specificato la versione di Delphi o di indy, ma ho avuto qualche problema prima con Indy in bundle con Delphi 2009 e HTTPS, e quando ho ricevuto l'ultima fonte da indy svn, il problema è stato risolto.

1

Un'altra alternativa a Indy è Synapse.

Questa libreria di classi offre il pieno controllo del post, ma offre anche un semplice metodo post uno di linea così:

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

La funzione HttpPostURL supporta https? – Ampere

1

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; 

fine;

Problemi correlati