Einzelnen Beitrag anzeigen

mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#1

Webservice + SSL + D2010

  Alt 8. Sep 2011, 16:00
Hallo,
ich versuche gerade einen Webservice über HTTPS zu konsumieren. Leider funktioniert es nicht.

Ich nutze dafür eigentlich nur die HTTPClient Komponente.
Hier ein Beispiel welches problemlos funktioniert:

Code:

function TForm2.SendRequest(): string;
var err, str: string;
    req: TStringStream;
    strings: TStringList;
begin
try
 
    strings := TStringList.Create;
    XMlDoc.XML.LoadFromFile('weather.xml');
    strings.AddStrings(XMlDoc.XML);

    HttpClient.Request.URL := 'http://www.webservicex.net/WeatherForecast.asmx';
    HttpClient.Request.Accept := 'text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2';
    HttpClient.Request.ContentType := 'application/soap+xml;charset=iso-8859-1;action="urn:sendblabla"';
    req := TStringStream.Create(strings.GetText);

    try
      str := HttpClient.Post(HttpClient.Request.URL , req);

    except
      On E: EIdHTTPProtocolException do
      begin
        err := 'HTTP-Fehler: ' + E.Message;
        str := E.ErrorMessage;
      end;
      On E: Exception do
        err := 'Allgemeiner Fehler: ' + E.Message;
    end;
finally
  strings.free;
end;
  Result := str;
end;
Hier der request in weather.xml:
Code:
<?xml version='1.0' encoding='iso-8859-1'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webservicex.net">
   <soapenv:Header/>   
   <soapenv:Body>
      <web:GetWeatherByPlaceName>
         <web:PlaceName>London</web:PlaceName>
      </web:GetWeatherByPlaceName>      
   </soapenv:Body>
</soapenv:Envelope>

Nutze ich nun fast den selben Code für einen HTTPS Webservice bekomme ich immer die Fehlermeldung Soecketerror #0:
Mein Code dafür sieht so aus:

Code:
var err, str: string;
    req: TStringStream;
    strings, header: TStringList;
    SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;

begin
try
    SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(self);
    with SSLIOHandler do
    begin
      SSLOptions.Mode := sslmClient;
      SSLOptions.Method := sslvSSLv3;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;

    end;
     HttpClient.IOHandler := SSLIOHandler;

    header := TStringList.Create;
    header.LoadFromFile('header.txt');
    HttpClient.Request.RawHeaders.Assign(header);

    strings := TStringList.Create;
    XmlDoc.XML.LoadFromFile('hsst.xml');
    strings.AddStrings(XmlDoc.XML);

    HttpClient.BoundPort := 443;

    HttpClient.Request.URL := 'https://******************/webservice/********Service';
    HttpClient.Request.Accept := 'text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2';
    HttpClient.Request.ContentType := 'application/soap+xml;charset=iso-8859-1;action="urn:sendBlabla"';

    req := TStringStream.Create(strings.GetText);

    str := HttpClient.Post(HttpClient.Request.URL , req);


except
      On E: EIdHTTPProtocolException do
      begin
        err := 'HTTP-Fehler: ' + E.Message;
        str := E.ErrorMessage;
      end;
      On E: Exception do
        err := 'Allgemeiner Fehler: ' + E.Message;


end;

   strings.free;
   header.Free;
   SSLIOHandler.Free;
   mmo2.Text := str;
end;
Die header.txt sieht so aus:
Code:
POST https://********/webservice/*********** HTTP/1.1
Content-type: text/xml;charset="utf-8"
Authorization: Basic ***************==
Soapaction: "http://***********.de/abrufen*****"
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Host: **********:443
Connection: keep-alive
Content-Length: 719
Anzumerken ist noch, dass der Webservice http Basic Authentifizierung erfordert, deshalb wurde in der header.txt auch Autorization base64 codiert.
Die hsst.xml beinhaltet hier die Soap-Nachricht, jedoch stimmt diese 100%, deshalb liste ich diese mal hier nicht auf.

Hat jemand einen Rat warum es nicht funktioniert? Muss ich bei SSL und Webservices noch etwas beachten?

Das interessante ist, dass ich den Service mit dem Tool SoapUI proplemlos nutzen kann.
Ich weiß ist etwas viel, aber sitz jetzt schon 2 Tage dran und komm nicht mehr weiter.

Wäre nett, wenn mir jemand helfen könnte.
Vielen Dank.
mc
  Mit Zitat antworten Zitat