AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke SOAP Client Problem treibt mich in den Wahnsinn
Thema durchsuchen
Ansicht
Themen-Optionen

SOAP Client Problem treibt mich in den Wahnsinn

Ein Thema von helste · begonnen am 11. Feb 2019 · letzter Beitrag vom 11. Feb 2019
Antwort Antwort
Seite 1 von 2  1 2      
helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 09:21
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 09:40
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.

Geändert von TiGü (11. Feb 2019 um 10:40 Uhr)
  Mit Zitat antworten Zitat
helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 09:46
Danke. Habe Fiddler gerade installiert und werde mal schauen, ob ich da mehr raus bekomme.
  Mit Zitat antworten Zitat
helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 12:45
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 13:14
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.
  Mit Zitat antworten Zitat
helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 13:28
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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 13:52
Der Content-Length Header unterscheidet sich auch. Bei gleichem SOAP Body müsste die gleiche Länge erscheinen
Michael Justin
  Mit Zitat antworten Zitat
helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 14:20
Ja, aber der kommt nicht von mir, zumindest nicht bewusst.
Keine Ahnung, warum der unterschiedlich ist.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 14:20
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;
  Mit Zitat antworten Zitat
helste

Registriert seit: 16. Jul 2009
72 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: SOAP Client Problem treibt mich in den Wahnsinn

  Alt 11. Feb 2019, 14:37
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>
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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