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