![]() |
Delphi-Version: 7
HTTPRio + SSL
Guten Morgen miteinander,
ich versuche mich zur Zeit daran ein Soap Client (Hermes) zu erstellen. Jedoch erhalte ich immer eine Fehler Meldung: An error ocurred in the secure channel support - URL: ![]() Muss man bzgl. SSL und HTTPRio noch zusätzlich etwas einstellen? Ich erhalte vom Server keine Antwort, also muss das Problem ja schon bei mir hängen :? Schöne Grüße |
AW: HTTPRio + SSL
Zitat:
|
AW: HTTPRio + SSL
Hi,
schonmal Danke für die Antwort.
Code:
Den Request setze ich bei BeforeExecute manuell zusammen, da Delphi mir ansonsten den Header nie vernünftig hinzugefügt hat:
if not assigned(HTTPRio1_Stream) then
begin HTTPRio1_Stream := THTTPRio_Stream.Create(versandBrwFrm); end; HTTPRio1_Stream.WSDLLocation := 'C:\Dokumente und Einstellungen\user\Desktop\PriPS.xml'; HTTPRio1_Stream.Port := 'PriPSPort'; HTTPRio1_Stream.Service := 'PriPSService'; HTTPRio1_Stream.OnBeforeExecute := HTTPRIO1_StreamBeforeExecute; HTTPRio1_Stream.OnAfterExecute := HTTPRIO1_StreamAfterExecute; Service := HermesPriPS.GetPriPS(True,'',HTTPRio1_Stream); hdr := verifyingToken.Create; hdr.UserID := 'XXX'; hdr.UserPW := 'XXX'; HTTPRio1_Stream.SOAPHeaders.SetOwnsSentHeaders(true); HTTPRio1_Stream.SOAPHeaders.Send(hdr); Service.pripsCheckAvailability();
Code:
Der Request sieht auch meiner Meinung nach richtig aus, der ähnliche Weg funktioniert an anderer Stelle auch, nur hier isr keine SSL verschlüsselung vorhanden.
try
UebXml := TXMLDocument.Create(nil); UebXml.Active := True; UebXml.Version := '1.0'; UebXml.Encoding := 'UTF-8'; UebXml.Options := UebXml.Options + [doNodeAutoIndent]; UebXml.DocumentElement := UebXml.CreateNode('soapenv:Envelope', ntElement, ''); UebXml.DocumentElement.Attributes['xmlns:soapenv'] := 'http://schemas.xmlsoap.org/soap/envelope/'; UebXml.DocumentElement.Attributes['xmlns:wsse'] := 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd'; UebXml.DocumentElement.Attributes['xmlns:wsu'] := 'http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'; lXmlNode := UebXml.DocumentElement.AddChild('soapenv:Header').AddChild('wsse:Security'); lXmlNode.Attributes['soapenv:mustUnderstand'] := '1'; // lXmlNode.Attributes['xmlns:wsse'] := 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd'; // lXmlNode.Attributes['xmlns:wsu'] := 'http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'; lXmlNode := lXmlNode.AddChild('wsse:UsernameToken'); lXmlNode.Attributes['wsu:Id'] := 'UsernameToken-102'; lXmlNode.AddChild('wsse:Username').NodeValue := 'XXX'; lXmlNode := lXmlNode.AddChild('wsse:Password'); lXmlNode.Attributes['Type'] := 'http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'; lXmlNode.NodeValue := 'XXX'; lXmlNode := UebXml.DocumentElement.AddChild('soapenv:Body').AddChild('pripsCheckAvailability'); SOAPRequest.Size := 0; SOAPRequest.Position := 0; UebXml.Active := True; UebXml.Active := True; UebXml.SaveToStream(SOAPRequest); finally if assigned(UebXml) then begin UebXml.Active := false; UebXml := nil; end; end;
Code:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <soapenv:Header> <wsse:Security soapenv:mustUnderstand="1"> <wsse:UsernameToken wsu:Id="UsernameToken-102"> <wsse:Username>xxx</wsse:Username> <wsse:Password Type="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxx</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body> <soapenv:pripsCheckAvailability/> </soapenv:Body> </soapenv:Envelope> |
AW: HTTPRio + SSL
Deine Anfrage ist auch richtig, konnte sie gerade ohne Probleme an
![]() |
AW: HTTPRio + SSL
In der WSDL-Datei ist https angegeben:
Code:
Importiert wurde diese auch korrekt:
<wsdl:service name="PriPSService">
<wsdl:port binding="tns:PriPSServiceSoapBinding" name="PriPSPort"> <soap:address location="https://hermesapisbx.hlg.de/hermes-api-prips-web/services/v15/PriPS"/> </wsdl:port> </wsdl:service>
Code:
Kann ich bei BeforeExecute nochmal prüfen, welche URL nun wirklich angeprochen wird?
function GetPriPS(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): PriPS;
const defWSDL = 'C:\Dokumente und Einstellungen\user\Desktop\PriPS.xml'; defURL = 'https://hermesapisbx.hlg.de/hermes-api-prips-web/services/v15/PriPS'; defSvc = 'PriPSService'; defPrt = 'PriPSPort'; var |
AW: HTTPRio + SSL
Ich hab das ganze schnell selber importiert und es geht ohne Probleme. Einfach WSDL-Import Wizard durchlaufen lassen.
Code:
Mit der Antwort
HTTPRio := THTTPRIO.Create(nil);
HTTPRio.OnBeforeExecute := BeforeExecute; HTTPRio.OnAfterExecute:= AfterExecute; FPriPS := GetPriPS(true,'',HTTPRio); FPriPS.pripsCheckAvailability;
Code:
Wo du jetzt die Zieladresse auslesen kannst weiß ich nicht, ich verwende dafür immer Wireshark, die ungeschönte Wahrheit.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body> <soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>Fault occurred while processing.</faultstring> <detail> <ns3:SecurityException xmlns:ns3="http://exception.common.service.hlg.de" xmlns:ns2="http://hermes_api.service.hlg.de"> <exceptionItems> <errorMessage>Die Consumer Authentifizierung ist fehlerhaft.</errorMessage> <errorCode>310023</errorCode> <errorType>B</errorType> </exceptionItems> </ns3:SecurityException> </detail> </soap:Fault> </soap:Body> </soap:Envelope> |
AW: HTTPRio + SSL
Wirklich noch Delphi 7?
AFAIK sind in dieser sehr alten Version noch einige (mehr) Mängel in der Implementierung vorhanden die in neueren Versionen schon gefixt wurden. |
AW: HTTPRio + SSL
Hi,
ja siehste mal, manche leben halt noch gern in der Vergangenheit:? Habe es nun mal auf einem anderen PC versucht -> kein WinXP:shock: Nun erhalte ich auch ein Response -> Zwar mit der Meldung
Code:
aber das ist ja schonmal ein Anfang.
<errorMessage>Die Consumer Authentifizierung ist fehlerhaft.</errorMessage>
<errorCode>310023</errorCode> <errorType>B</errorType> |
AW: HTTPRio + SSL
Zitat:
Da müsstest du schon ein Komponenten verwenden (ipworks?) welche alle modernen noch als sicher angesehen Verschlüsselungsmethoden selbst mitbringt. |
AW: HTTPRio + SSL
Soweit ich es überblicke bietet Hermes auch direkt einen REST Service an und da du bereits die halbe SOAP Message selber aufbaust, sehe ich keinen Sinn dahinter weiter auf SOAP zu setzen. Besser du verwendest REST über einen http Client. Wenn Delphi 7 die indy Komponenten nicht mitausliefert, kannst du die Nachinstallieren, das könnte auch die TLS Probleme gleich mitlösen.
|
AW: HTTPRio + SSL
Habe ich bisher noch nirgendwo etwas von gelesen, aber auch noch nicht explicit nach gesucht (REST).
Im Developer Portal steht mir zurzeit nur Soap zur Verfügung. Wenn es unter WinXP nicht funktioniert ist es auch kein Weltuntergang. Hatte vorhin noch eine EMail an den Support gesendet, mal sehen ob die eventuell helfen können. Also erstmal Antwort abwarten und weitersehen. Besten Dank euch beiden schonmal und schönes Wochenende:thumb: |
AW: HTTPRio + SSL
Muss bezüglich REST was beachtet werden?
Da ich noch auf die Antwort von Hermes warte, habe ich mir schonmal die DPD Schnittstelle angeschaut. Hier steht mir neben SOAP auch REST zur Verfügung. Habe meine XML-Datei konfiguriert und eine Abfrage per IDHTTP.POST durchgeführt.
Code:
In der Antwort erhalte ich nur Fehler bezüglich Authentifizierung und Versions Nr usw.
IdHTTP1.Request.URL := 'https://cloud-stage.dpd.com/api/v1/setOrder';
IdHTTP1.Request.ContentType := 'text/xml; charset=utf-8'; IdHTTP1.Post(IdHTTP1.Request.URL,MSRequest,MSResponse); Da die Versionsnummer aber übermittelt wird, hat das für mich ja den Anschein, dass die XML-Datei nicht ankommt oder nicht gelesen werden kann :shock: Request:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<setOrderRequest> <Version>100</Version> <Language>de_DE</Language> <PartnerCredentials> <Name>xxxx</Name> <Token>xxxxxx</Token> </PartnerCredentials> <UserCredentials> <cloudUserID>xxxx</cloudUserID> <Token>xxxxxxxxx</Token> </UserCredentials> <OrderAction>startOrder</OrderAction> <OrderSettings> <ShipDate>2018-01-08T11:18:09</ShipDate> <LabelSize>PDF_A4</LabelSize> <LabelStartPosition>UpperLeft</LabelStartPosition> </OrderSettings> <OrderDataList> <OrderData> <ShipAdress> <Gender>male</Gender> <Company>xxx</Company> <Salutation>Herr</Salutation> <Name></Name> <FirstName>xxx</FirstName> <LastName>xxx</LastName> <Street>xxx</Street> <HouseNo>6</HouseNo> <Country>DE</Country> <ZipCode>xxx</ZipCode> <City>Drebber</City> <State></State> <Phone>xxx</Phone> <Mail>xxx</Mail> </ShipAdress> <ParcelData> <ShipService>Classic</ShipService> <Weight>10.5</Weight> <Content>xxx</Content> <YourInternalID>123456</YourInternalID> <Reference1>Knr.: 5555</Reference1> <Reference2>Auftrags.-Nr.: 123456</Reference2> </ParcelData> </OrderData> </OrderDataList> </setOrderRequest>
Code:
<?xml version="1.0"?> <setOrderResponseType xmlns="http://schemas.datacontract.org/2004/07/com.dpd.cloud.business.apiPublic" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Ack>false</Ack> <ErrorDataList> <ErrorDataType> <ErrorCode>CLOUD_API_PARTNERCREDENTIALS</ErrorCode> <ErrorID>2000</ErrorID> <ErrorMsgLong>'Partner Credentials' ungültig.</ErrorMsgLong> <ErrorMsgShort>'Partner Credentials' ungültig.</ErrorMsgShort> </ErrorDataType> <ErrorDataType> <ErrorCode>CLOUD_API_VERSION</ErrorCode> <ErrorID>2004</ErrorID> <ErrorMsgLong>Die angegebene API Version ist ungültig. Letzte API Version derzeit = 100.</ErrorMsgLong> <ErrorMsgShort>API Version ungültig.</ErrorMsgShort> </ErrorDataType> <ErrorDataType> <ErrorCode>CLOUD_API_LANGUAGE</ErrorCode> <ErrorID>2005</ErrorID> <ErrorMsgLong>The API language versions are'de_DE' for German and 'en_EN' for English.</ErrorMsgLong> <ErrorMsgShort>Language: 'de_DE' or 'en_EN'</ErrorMsgShort> </ErrorDataType> </ErrorDataList> <LabelResponse i:nil="true" xmlns:d2p1="http://schemas.datacontract.org/2004/07/com.dpd.cloud.business"/> <Language/> <SystemInformation i:nil="true"/> <TimeStamp>2018-01-08T11:11:27.5565912+01:00</TimeStamp> <Version>0</Version> </setOrderResponseType> |
AW: HTTPRio + SSL
Hast du eine Lösung für dein Problem gefunden? Wäre interessant weil ich jetzt Jahre später genau das gleiche Problem habe....^^
|
AW: HTTPRio + SSL
Soweit ich den obigen Code anschaue, fehlt da der ganze SOAP-Envelope Teil drumherum. Mit anderen Worten, das XML ist nicht SOAP-konform. HTTPRio macht das normalerweise richtig. Der direkte Aufruf mit Indy ohne SOAP-Teil kann daher nicht gehen. Verwende die Delphi Klassen die vom WDSL Importer erstellt wurden mit HTTPRio.
Das Ganze hat aber nicths mit SSL zu tun. Ob du also wirklich das selbe Problem hast, musst du genauer mitteilen. Hier mal ein Beispiel einer Anfrage an einen SOAP-Dienst, wie der sein müsste:
Code:
HTTP Header
----------- POST /soap HTTP/1.1 SOAPAction: "" Content-Type: text/xml User-Agent: Borland SOAP 1.2 Host: 172.17.211.8:8080 Content-Length: 1882 Connection: Keep-Alive Cache-Control: no-cache Post-Daten: ---------- <?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <CreateLabelRequest xmlns="urn:labelprintWs"> <printer></printer> <parcelNumber></parcelNumber> <serviceCode>NP</serviceCode> <customerBarcode1>123456789-1</customerBarcode1> <customerBarcode2>234567891</customerBarcode2> <customerBarcode3>345678911</customerBarcode3> <customerBarcode4>456789111</customerBarcode4> <receiverName1>Max Mustermann</receiverName1> <receiverName2>Name 2</receiverName2> <receiverName3>Name 3</receiverName3> <receiverStreet>Bahnweg 29</receiverStreet> <receiverCity>Testlingen</receiverCity> <receiverZipCode>5000</receiverZipCode> <receiverCountry>CH</receiverCountry> <receiverPhone>099 999 99 99</receiverPhone> <senderName1>Test Meier</senderName1> <senderName2>EDV Abteilung</senderName2> <senderStreet>Mustergasse 2</senderStreet> <senderZipCode>5555</senderZipCode> <senderCity>Testlingen</senderCity> <senderCountry>CH</senderCountry> <countParcelsOfShipment>3</countParcelsOfShipment> <numberOfThisParcelInShipment>1</numberOfThisParcelInShipment> <weight>2.500</weight> <delisId>KD30000</delisId> <predictNotificationLanguage>DE</predictNotificationLanguage> <predictContactData>Kontakt / 099 999 99 99</predictContactData> </CreateLabelRequest> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Als Antwort kommt dann sowas retour:
Code:
Aber wie gesagt, dieser ganze Datenverkehr mach die HTTPRio Komponente automatisch und du musst nur die erzeugten Klassen nutzten ohne darüber nachzudenken, wie du das übertragen musst. Das Delphi SOAP Framework macht das alles für dich.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/> <SOAP-ENV:Body> <ns3:CreateLabelResponse xmlns:ns3="urn:labelprintWs"> <success>true</success> <message>success</message> <parcelNumber>06086068925645</parcelNumber> <labelId>233</labelId> <base64pdf></base64pdf> <additionalInfo></additionalInfo> </ns3:CreateLabelResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz