Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   SOAP Client Problem treibt mich in den Wahnsinn (https://www.delphipraxis.net/199672-soap-client-problem-treibt-mich-den-wahnsinn.html)

helste 11. Feb 2019 08:21

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.

TiGü 11. Feb 2019 08:40

AW: SOAP Client Problem treibt mich in den Wahnsinn
 
Probiere mal Fiddler (https://www.telerik.com/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.

helste 11. Feb 2019 08:46

AW: SOAP Client Problem treibt mich in den Wahnsinn
 
Danke. Habe Fiddler gerade installiert und werde mal schauen, ob ich da mehr raus bekomme.

helste 11. Feb 2019 11:45

AW: SOAP Client Problem treibt mich in den Wahnsinn
 
Fiddler zeigt mir folgenden HTTP Request, wenn ich SOAPUI benutze:

POST http://piwstest.eu.sappi.com/XISOAPA.../sappi.com/atp HTTP/1.1
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 http://piwstest.eu.sappi.com/XISOAPA.../sappi.com/atp HTTP/1.1
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?

TiGü 11. Feb 2019 12:14

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.

helste 11. Feb 2019 12:28

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 http://piwstest.eu.sappi.com/XISOAPA.../sappi.com/atp HTTP/1.1
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 http://piwstest.eu.sappi.com/XISOAPA.../sappi.com/atp HTTP/1.1
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.

mjustin 11. Feb 2019 12:52

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 :)

helste 11. Feb 2019 13:20

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.

TiGü 11. Feb 2019 13:20

AW: SOAP Client Problem treibt mich in den Wahnsinn
 
Zitat:

Zitat von helste (Beitrag 1425249)
Wenn es dann immer noch nicht geht, weiß ich auch nicht mehr.

Du könntest dein eigens THTTPRIO-Objekt erzeugen und das verwenden.
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;

helste 11. Feb 2019 13:37

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:
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;
Im Memofeld "response" steht dann am Ende folgendes drinnen:




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 18:14 Uhr.
Seite 1 von 2  1 2      

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