Soap-Service: XML-Fehler
Hallo zusammen,
Ich bastele an einem SOAP-Client (MyDHLAPI von DHL Express). Beim Aufruf der aus der wdsl importieren Function getRateRequest erhalte ich diesen Fehler: Zitat:
Delphi-Quellcode:
In HTTPRIOBeforeExecute und HTTPRIOAfterExecute cheche ich, was in SOAPRequest bzw. in SOAPResponse drin steht. SOAPRequest ist in Ordnung, SOAPResponse ist leer.
procedure TDHLExpress.DoRateRequest;
var Request:RateRequest; // aus der wdsl Response:RateResponse; // aus der wdsl DHLExpressService:gblExpressRateBook; // aus der wdsl DhlExpressHeader:TDHLExpressSoapHeader; RIO : THTTPRIO; begin RIO := THTTPRIO.Create(nil); RIO.OnAfterExecute :=HTTPRIOAfterExecute; RIO.OnBeforeExecute:=HTTPRIOBeforeExecute; DHLExpressService:=GetgblExpressRateBook(false, '', RIO); DhlExpressHeader :=TDHLExpressSoapHeader.Create; // Für Authentication DHLExpressHeader.User:=fUser; DHLExpressHeader.Signature:=fSignature; Request:=RateRequestCreate; // Hier wird der Request zusammengebaut try (DHLExpressService as ISOAPHeaders).Send(DHLExpressHeader); Response:=DHLExpressService.getRateRequest(Request); // Hier kommt der Fehler finally Request.Free; DhlExpressHeader.Free; end; end; In einem ähnlichen Fall mit einer anderen API von DHL (nicht Express) funktioniert alles nach diesem Schema bestens. Was könnte da passiert sein? |
AW: Soap-Service: XML-Fehler
Also der Fehler "Ein XML-Dokument muss ein Element der obersten Ebene enthalten." kommt wahrscheinlich nur, weil der SOAP-Server eine leere bzw. gar keine Antwort gesendet hat. Das ist quasi so, als würde man eine leere Textdatei als XML-Dokument einlesen wollen.
Zur Lösungsfindung würde ich zuerst die komplette Aufruf-URL in den Browser werfen und sehen, ob da eine Antwort kommt. |
AW: Soap-Service: XML-Fehler
Delphi/Indy-Update?
Ich hab grade den Fall bei einer REST-Komponente. Alter Code läuft, aber im neuen Delphi nicht. Die Anfrage/Response ist anders, daher liefert der REST-Server nichts, bzw. was Falsches. Wir wollen JSON, aber jetzt sendet das Ding teilweise XML zurück, bzw. auch gern mal leere Daten.
Code:
[ XE ]
GET /user/getErpPublicKey HTTP/1.1 Content-Type: application/json; charset=UTF-8 Host: localhost:9999 Accept: text/html, */* Accept-Encoding: identity User-Agent: Mozilla/3.0 (compatible; Indy Library) [ 11 ] GET /user/getErpPublicKey HTTP/1.1 Content-Type: application/json; charset=UTF-8 Host: localhost:9999 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/3.0 (compatible; Indy Library) [ 11 + IdHTTP.Request.Accept := 'application/json'; ] GET /user/getErpPublicKey HTTP/1.1 Content-Type: application/json; charset=UTF-8 Host: localhost:9999 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/3.0 (compatible; Indy Library) |
AW: Soap-Service: XML-Fehler
Bei der Arbeit mit Indy hilft es kolossal hier
Delphi-Quellcode:
was aktuelleres zuzuweisen.
User-Agent: Mozilla/3.0 (compatible; Indy Library)
Z. B. das, was Dir diese Seite, aus Deinem Lieblingsbrowser aufgerufen, anzeigt. Etliche Webserver liefern beim "OriginalIndyUserAgent" keine Antwort oder nur, dass ihnen der Browser etwas zu alt ist und man doch lieber was Neueres nehmen sollte. |
AW: Soap-Service: XML-Fehler
Zitat:
Alternativ zum Debugger könnte ein loggender HTTP Proxy wie Fiddler2 - https://www.telerik.com/fiddler - eingesetzt werden. (Oder ein Packet Sniffer). Update: Zitat:
|
AW: Soap-Service: XML-Fehler
[QUOTE=mjustin;1518161]
Zitat:
Zitat:
|
AW: Soap-Service: XML-Fehler
Ich glaube, dieses Postman bringt mich ein Stück weiter:
Wenn ich meinen SOAPRequest damit abschicke, kommt auch dort kein Response an. Aber: Mein SOAPRequest enthält einen Header zur Authentifizierung:
Code:
Wenn ich den weglasse, kommt immerhin ein Response an, der logischerweise besagt, dass man Unauthorized ist:
<SOAP-ENV:Header>
<ns2:Security env:mustUnderstand="true"> <ns2:UsernameToken ns3:Id="UsernameToken-4C578AF5E8CBB3162A14952041422019"> <ns2:Username>******</ns2:Username> <ns2:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">******</ns2:Password> <ns2:Nonce EncodingType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">SC4DEqvj1tX0yuY6sFXMvQ==</ns2:Nonce> </ns2:UsernameToken> </ns2:Security> </SOAP-ENV:Header>
Code:
Also stimmt da anscheinend etwas mit diesem Header nicht.
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header></env:Header> <env:Body> <env:Fault> <faultcode>env:Server</faultcode> <faultstring></faultstring> <detail fault:type="Unauthorized" xmlns:fault="http://www.dhl.com/soapfaults"></detail> </env:Fault> </env:Body> </env:Envelope> |
AW: Soap-Service: XML-Fehler
Code:
Was mir auffällt: ... Password Type="" ... und EncodingType="", also ein kodiertes " am Anfang, aber kein schliessendes " am Ende des Attributs.
<ns2:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">******</ns2:Password>
<ns2:Nonce EncodingType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">SC4DEqvj1tX0yuY6sFXMvQ== Sind diese " am Anfang des Attributs so vorgesehen? |
AW: Soap-Service: XML-Fehler
Nein, die " waren falsch. Die gehören da nicht hin. Daran liegt es aber nicht. Ohne erhalte ich das selbe Ergebnis.
|
AW: Soap-Service: XML-Fehler
Vielleicht mit Anderen ähnlichen Problemen vergleichen?
https://www.google.com/search?q=%22n...tUnderstand%22 Es gibt da z.B. so Hinweise wie Zitat:
Einige SOAP-Services kann man auf JSON umstellen z.B.
Delphi-Quellcode:
accept: application/json,*/*
Dort sieht das Ganze eventuell viel einfacher und nicht so vernamespaced aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz