![]() |
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 ![]() 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 - ![]() 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?
![]() 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 11:14 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 by Thomas Breitkreuz