2010-11-19 6 views
15

Was ist der einfachste Weg, um eine HTTPS-POST-Anfrage in Delphi zu machen? Ich habe keine Probleme mit HTTP-POST-Anfragen, aber wie kann ich das mit SSL machen? Ich habe gegoogelt und nichts gefunden, was das gut genug erklärt.Wie man eine HTTPS POST Anfrage in Delphi macht?

Hier ist der Code, den ich versuchte:

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; 

Wenn ich versuche, es mir folgende Fehlermeldung erhalten auszuführen:

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

Ich verstehe das nicht. Ich habe Parameter gesendet, obwohl die Fehler so klingen, als hätte ich eine Datei gesendet.

Auch habe ich Libeay32.dll und ssleay32.dll in meinem Ordner myProject.exe enthalten.

+0

Haben Sie jemals eine Lösung gefunden? –

Antwort

3

Sie haben Ihre Delphi-Version oder Indy-Version nicht angegeben, aber ich hatte einige Probleme mit dem mitgelieferten Indy mit Delphi 2009 und HTTPS, und als ich die neueste Quelle von indy svn bekam, löste sich das Problem.

1

Eine weitere Alternative zu Indy ist Synapse.

Diese Klassenbibliothek bietet die volle Kontrolle über die Post, sondern bietet auch eine einfache Methode post Motto auch:

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

Unterstützt Ihre HttpPostURL-Funktion 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; 

Ende;