![]() |
SOAP Client Problem treibt mich in den Wahnsinn
Hallo zusammen,
bin dem Wahnsinn nahe mit einem Problem bei dem Versuch einen SOAP Client zu schreiben. In Delphi XE Berlin verwende ich den WSDL Assistenten um ein WSDL File zu importieren. Mit der so erzeugten Schnittstelle versuche ich nun von einem SOAP Server Daten zu holen. Mit SOAP UI funktioniert es mit den gleichen Einstellungen, aber von meinem Client aus nicht. Da bekomme ich kein SOAP, sondern nur HTML zurück und zwar die Statusseite, die im Browser angezeigt wird, wenn ich die URL eingebe. Ich habe schon versucht mit Wireshark den traffic zu analysieren, aber was da mit HTTP Post geschickt wird, sieht für mich bei SOAPUI ziemlich gleich aus, wie von meinem Client. Sehe zumindest keinen relevanten Unterschied. An sich hatte ich mit der Methode über den WSDL Assistenten nie Probleme Zugriff auf einen SOAP Server zu bekommen. Irgendwas übersehe ich wohl. Vielleicht etwas ganz einfaches, aber ich komme nicht dahinter. Vielleicht kann mir ja jemand einen Tipp geben, in welche Richtung ich suchen soll. |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Probiere mal Fiddler (
![]() Das ist so ähnlich wie Wireshark, aber ich finds ganz hilfreich, da er gleich die SOAP-Requests und -Respones vom XML in eine TreeView-Darstellung lädt. |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Danke. Habe Fiddler gerade installiert und werde mal schauen, ob ich da mehr raus bekomme.
|
AW: SOAP Client Problem treibt mich in den Wahnsinn
Fiddler zeigt mir folgenden HTTP Request, wenn ich SOAPUI benutze:
POST ![]() Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://sap.com/xi/WebService/soap1.1" Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXX Content-Length: 258 Host: piwstest.eu.sappi.com Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5) <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:rfc:functions"> <soapenv:Body> <urn:ZECOM_EU_CATALOG_STATUS_WS></urn:ZECOM_EU_CATALOG_STATUS_WS> </soapenv:Body> </soapenv:Envelope> Und das wenn ich aus meiner Testapplikation einen Request mache: POST ![]() Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://sap.com/xi/WebService/soap1.1" Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXX User-Agent: Apache-HttpClient/4.1.1 (java 1.5) Host: piwstest.eu.sappi.com Content-Length: 357 Connection: Keep-Alive Pragma: no-cache <?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><ZECOM_EU_CATALOG_STATUS_WS xmlns="urn:sap-com:document:sap:rfc:functions"></ZECOM_EU_CATALOG_STATUS_WS></SOAP-ENV:Body></SOAP-ENV:Envelope> Wo ist da der entscheidende Unterschied? |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Bei dir steht im Header zusätzlich "Pragma: no-cache".
Du fügst "<?xml version="1.0"?>" hinzu. Namespace ist bei denen "soapenv" und bei dir "SOAP-ENV". Innerhalb des Bodys gibt es bei denen "urn" vor "ZECOM_EU_CATALOG_STATUS_WS" und bei dir nicht. Dafür hast du das functions-Attribut (xmlns="urn:sap-com:document:sap:rfc:functions") da im Body zu stehen und nicht oben beim Envelope-Node. Einer oder mehrere von diesen Unterschieden wird's wohl sein. |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Ja, diese Unterschiede habe ich gesehen.
Die Frage ist nur, was davon die Ursache ist und wie ich das korrigieren kann. "Pragma: no-cache" kommt automatisch im Header dazu und ich weiß nicht warum. Das gleiche gilt für "<?xml version="1.0"?>". Keine Ahnung woher das kommt. Ich denke, dass die Bezeichnung des namespace egal ist. Ich habe jetzt mal in SOAP UI den Request durch den von meiner Anwendung geschickten Request ersetzt. Da funktioniert das genau so. Hier das RAW aus Fiddler von meiner App: POST ![]() Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://sap.com/xi/WebService/soap1.1" Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXX User-Agent: Apache-HttpClient/4.1.1 (java 1.5) Host: piwstest.eu.sappi.com Content-Length: 357 Connection: Keep-Alive Pragma: no-cache <?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><ZECOM_EU_CATALOG_STATUS_WS xmlns="urn:sap-com:document:sap:rfc:functions"></ZECOM_EU_CATALOG_STATUS_WS></SOAP-ENV:Body></SOAP-ENV:Envelope> Und hier das RAW vom SOAP UI Request: POST ![]() Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://sap.com/xi/WebService/soap1.1" Authorization: Basic XXXXXXXXXXXXXXXXXXXXXXXXXX Content-Length: 356 Host: piwstest.eu.sappi.com Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5) <?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><ZECOM_EU_CATALOG_STATUS_WS xmlns="urn:sap-com:document:sap:rfc:functions"></ZECOM_EU_CATALOG_STATUS_WS></SOAP-ENV:Body></SOAP-ENV:Envelope> Der einzige Unterschied den ich da sehe ist, abgesehen von der Reihenfolge im Header, "Pragma: no-cache". Warum das mitgeschickt wird, ist mir schleierhaft. Ich muss mal schauen, woher das kommt und wie ich das weg bekomme. Wenn es dann immer noch nicht geht, weiß ich auch nicht mehr. |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Der Content-Length Header unterscheidet sich auch. Bei gleichem SOAP Body müsste die gleiche Länge erscheinen :)
|
AW: SOAP Client Problem treibt mich in den Wahnsinn
Ja, aber der kommt nicht von mir, zumindest nicht bewusst.
Keine Ahnung, warum der unterschiedlich ist. |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Zitat:
Da kannst du dich in dem OnBeforeExecute-Eventhandler hängen. Du bekommst den Request als Stream geliefert, kurz bevor er gesendet wird. Diesen Stream kannst du in einen lokalen TStringStream laden und dir per Datastring-Property den Inhalt holen, alles was zuviel ist löschen und weiterschicken bzw. eine Stringkonstante mit dem Request aus SoapUI verwenden. Man kommt irgendwie auch an die Header von THTTPRIO.SOAPHeaders ran, aber da bin ich nicht so fit.
Delphi-Quellcode:
procedure TDeineKlasse.OnBeforeExecute(const MethodName: string; SOAPRequest: TStream);
var StringStream: TStringStream; begin StringStream := TStringStream.Create; try StringStream.LoadFromStream(SOAPRequest); //optionales anzeigen: OutputDebugString(PChar(StringStream.DataString)); Stream.DataString := 'Hier mit konstanten string füllen'; (SOAPRequest as TMemoryStream).Clear; (SOAPRequest as TMemoryStream).LoadFromStream(StringStream); finally StringStream.Free; end; end; |
AW: SOAP Client Problem treibt mich in den Wahnsinn
Ja, das hatte ich schon. Etwas anders zwar, aber sollte auch funktionieren. Habe so mal "<?xml version="1.0"?>" entfernt, obwohl das offensichtlich eh nicht stört. War nur um zu testen, ob mein Ansatz funktioniert.
Habe jetzt mal folgende Eventhandler drinnen:
Delphi-Quellcode:
Im Memofeld "response" steht dann am Ende folgendes drinnen:
procedure TForm1.HTTPRIOBeforeExecute(const MethodName: string;
SOAPRequest: TStream); var sl : tstringlist; begin sl := tstringlist.Create; SOAPRequest.Position := 0; sl.LoadFromStream(SOAPRequest); response.Lines.Add ('Request'); response.Lines.Add (sl.Text); response.Lines.Add ('--------------------------------------------------'); sl.Delete(0); response.Lines.Add (sl.Text); (SOAPRequest as TMemoryStream).Clear; sl.SaveToStream(SOAPRequest); sl.Free; end; procedure TForm1.HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream); var sl : tstringlist; begin sl := tstringlist.Create; SOAPResponse.Position := 0; sl.LoadFromStream(SOAPResponse); response.Lines.Add ('Response ------------------------------------------------------------------------------'); response.Lines.Add (sl.Text); sl.Free; end; procedure TForm1.HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); var s: String; Flag: LongBool; begin Flag := True; s := 'Accept-Encoding: gzip,deflate'; HttpAddRequestHeaders(Data, PChar(s), Length(s), HTTP_ADDREQ_FLAG_ADD); InternetSetOption(Data, INTERNET_OPTION_HTTP_DECODING, PChar(@Flag), SizeOf(Flag)); s := 'Content-Type: text/xml;charset=UTF-8'; HttpAddRequestHeaders(Data, PChar(s), Length(s), HTTP_ADDREQ_FLAG_REPLACE); s := 'SOAPAction: "http://sap.com/xi/WebService/soap1.1"'; HttpAddRequestHeaders(Data, PChar(s), Length(s), HTTP_ADDREQ_FLAG_REPLACE); s := 'Authorization: Basic ' + TNetEncoding.Base64.Encode('username:passwort'); HttpAddRequestHeaders(Data, PChar(s), Length(s), HTTP_ADDREQ_FLAG_REPLACE); s := 'User-Agent: Apache-HttpClient/4.1.1 (java 1.5)'; HttpAddRequestHeaders(Data, PChar(s), Length(s), HTTP_ADDREQ_FLAG_REPLACE); end; Request <?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><ZECOM_EU_CATALOG_STATUS_WS xmlns="urn:sap-com:document:sap:rfc:functions"></ZECOM_EU_CATALOG_STATUS_WS></SOAP-ENV:Body></SOAP-ENV:Envelope> -------------------------------------------------- <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><ZECOM_EU_CATALOG_STATUS_WS xmlns="urn:sap-com:document:sap:rfc:functions"></ZECOM_EU_CATALOG_STATUS_WS></SOAP-ENV:Body></SOAP-ENV:Envelope> Response ------------------------------------------------------------------------------ <html> <head><title>MessageServlet</title></head> <body> <h3>Message Servlet is in Status OK</h3> <h3>Status information:</h3> Servlet com.sap.aii.adapter.soap.web.MessageServlet (Version $Id: //tc/xpi.adapters/NW731EXT_16_REL/src/_soap_application_web_module/webm/api/com/sap/aii/adapter/soap/web/MessageServlet.java#1 $) bound to /MessageServlet <br/>Classname ModuleProcessor: null <br/>Lookupname for localModuleProcessorLookupName: localejbs/ModuleProcessorBean <br/>Lookupname for remoteModuleProcessorLookupName: null <br/>ModuleProcessorClass not instantiated <br/>ModuleProcessorLocal is Instance of com.sun.proxy.$Proxy1320 <br/>ModuleProcessorRemote not instantiated </body></html> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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