Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi SOAP WSDL Import ohne Header - Tokyo 10.2 (https://www.delphipraxis.net/202116-soap-wsdl-import-ohne-header-tokyo-10-2-a.html)

fisipjm 30. Sep 2019 16:07

SOAP WSDL Import ohne Header - Tokyo 10.2
 
Hi :cyclops:

Ich stehe gerade vor folgendem Problem bei dem ich nicht so Recht weiter komme.

Ich versuche einen Webservice via WSDL Anzubinden, die WSDL ist öffentlich zugänglich, deshalb denke ich mal ist es auch keine großes Problem den Link hier zu Posten.

https://www.virtic24.com/wsa/wsa1/ws...irdocBaustelle

Die WSDL wird sauber importiert und ich kann die entsprechenden Klassen ansprechen. Ein Anmeldung mit den Benutzerdaten funktioniert auch, super. Jetzt zum Problem.

Beim Connect mit den Benutzerdaten antwortet mir das System mit KostenstellenID im Header der Responce. Theoretisch bin ich davon ausgegangen, Delphi geht damit einfach im Hintergrund selbstständig um, leider ist das nicht der Fall. Bei jeder weiteren Anfrage bekomme ich die Fehlermeldung UUID nicht übertragen. Stimmt auch, wenn ich mit Wireshark mitlese, fehlt bei meinem POST der Header in gänze. Mein Frage, wie bekomm ich den da rein und vor allem wie bekommen die Klassen davon etwas mit?

Ähnliche Probleme hier:
https://www.delphipraxis.net/25252-w...ml#post1448505
https://www.symcon.de/forum/threads/...den-mit-Delphi
https://www.delphipraxis.net/191595-...eaderinfo.html


Gruß
PJM

Union 30. Sep 2019 16:31

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Bei den von dir verlinkten "ähnlichen Problemen" wurden doch auch Lösungen aufgezeigt. Hast Du die mal durchgeschaut?

fisipjm 1. Okt 2019 07:24

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Hi Union,

Zitat:

Zitat von Union (Beitrag 1448517)
Bei den von dir verlinkten "ähnlichen Problemen" wurden doch auch Lösungen aufgezeigt. Hast Du die mal durchgeschaut?

Die Lösungen verfolgen Meiner Meinung nach immer einen anderen Ansatz und genau da hängt auch glaube ich mein Verständnis.
Ich hab ja einen Body mit den eigentlichen Informationen die mir die Wrapper Class automatisch durch den WSDl Import generiert, wenn ich jetzt nur dem Headobject den Header migeben und dann .send aufrufe, wird doch auch nur der Head teil geschickt und nicht der Body Part um den es mir ja eigentlich geht, oder bin ich da ganz falsch gewickelt?

fisipjm 2. Okt 2019 13:42

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Neuer Tag neues Glück :)

Ich hab es mittlerweile hin bekommen den SOAP-HEADER zu erweitern. Ich mache es mit dem ObjectToSOAP Event eines TsoapHeader Objekts und CASTE mein Webservice als ISOAPHeader sieht dann so aus:

Delphi-Quellcode:
type
  TUUID = class(TSoapHeader)
  private
    FUUID: string;
  public
    function ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter;
      const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions;
      out RefID: InvString): IXMLNode; override;
  published
    property UUID: string read FUUID write FUUID;
  end;


....

function TUUID.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter;
  const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString)
  : IXMLNode;
begin
  Result := ParentNode.AddChild('UUID');
  Result.Text := UUID;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  WebServiceKostenstelle: wsKostenstelleObj;
  lHeader : TSOAPHeader;
  lUUID : TUUID;
begin
  WebServiceKostenstelle := GetwsKostenstelleObj(true, '', HTTPRIO1);
  lUUID:= TUUID.Create;

  lUUID.UUID:='DEMO-UUID';
  (WebServiceKostenstelle as ISOAPHeaders).send(luuid);
  WebServiceKostenstelle.Connect_wsKostenstelle('', '', '');
end;
Leider bekomme ich die Anfrage nicht passend hin...

erwartet wird folgendes:
Code:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:kos="virrpcKostenstelle/kostenstelle">
   <soapenv:Header>
      <kostenstelleID xsi:type="kos:kostenstelleID">
         <UUID xsi:type="xsd:string">05a7df56e81ee20b:7328b961:1406ccf6a97:-7fff;&lt;virrpcKostenstelle|PX-279394|PO>;tliStYV2ghJRLlJRXflTXg==</UUID>
      </kostenstelleID>
   </soapenv:Header>
Meine Anfrage erzeugt aber das:

Code:
<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" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:UUID>DEMO-UUID</SOAP-ENV:UUID></SOAP-ENV:Header>
Wer langsam wahnsinnig und kenn mich leider auch nicht all zu gut mit XML aus :oops: jemand eine Idee?

Gruß
PJM

TiGü 2. Okt 2019 14:58

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Wie ist es denn so?

Delphi-Quellcode:
function TUUID.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter;
  const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode;
var
    KostenstelleIDNode: IXMLNode;
    UUIDNode: IXMLNode;
begin
    KostenstelleIDNode := ParentNode.AddChild('kostenstelleID');
    KostenstelleIDNode.Attributes['type'] := 'kos:kostenstelleID';

    UUIDNode := KostenstelleIDNode.AddChild('UUID');
    UUIDNode.Attributes['type'] := 'xsi:string';
    UUIDNode.Text := UUID;

    Result := KostenstelleIDNode;
end;

fisipjm 2. Okt 2019 15:39

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Dann schaut es so aus:

Code:
<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" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Header SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:kostenstelleID type="kos:kostenstelleID"><SOAP-ENV:UUID type="xsi:string">DEMO-UUID</SOAP-ENV:UUID></SOAP-ENV:kostenstelleID></SOAP-ENV:Header>
Hab immer noch den SOAP-ENV part vorne dran, ist aber schon mal deutlich näher dran :thumb:

Union 2. Okt 2019 16:10

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Hast Du in den THttpRio.Converter.Options [soLiteralParams] drin? Standard ist ja nur [soSendMultiRefObj, soRootRefNodesToBody, soTryAllSchema, soCacheMimeResponse, soUTF8EncodeXML]

Incocnito 4. Okt 2019 07:07

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Zitat:

Zitat von fisipjm (Beitrag 1448825)
...

erwartet wird folgendes:
Code:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:kos="virrpcKostenstelle/kostenstelle">
   <soapenv:Header>
      <kostenstelleID xsi:type="kos:kostenstelleID">
         <UUID xsi:type="xsd:string">05a7df56e81ee20b:7328b961:1406ccf6a97:-7fff;&lt;virrpcKostenstelle|PX-279394|PO>;tliStYV2ghJRLlJRXflTXg==</UUID>
      </kostenstelleID>
   </soapenv:Header>
...

Ganz so wird das hoffentlich nicht erwartet, denn ein ">" mitten im String geht so nicht! da müsste "&gt;" oder so stehen!

Problem scheint ja auch noch zu sein, dass die ganze Root-Node schon anders benannt ist ... "SOAP-ENV:Envelope" statt "soapenv:Envelope" ... ich denke die WSDL scheint nicht so recht zu passen ... kannst du (bei der Stelle welche die Nachrichten dann in Empfang nimmt) nachfragen, ob das überhaubt die passende/richtige ist?

MfG Incocnito

fisipjm 7. Okt 2019 13:56

AW: SOAP WSDL Import ohne Header - Tokyo 10.2
 
Hey und willkommen zurück aus dem langen Wochenede :-D

Es läuft :)

@Union - Danke für den Parameter, war mir gar nicht bewusst was man alles noch an der Stelle konfigurieren kann, hatte aber tatsächlich keinen Einfluss auf das ganze.

Es funktioniert jetzt tatsächlich mit dem POST den ich als letztes rein gestellt hatte.
Beim nochmaligen durchgehen der WSDL und der daraus erzeugten Unit/Klassen ist mir aufgefallen, das für diese "UUID" bereits etwas mitimplementiert wurde. Entspricht im Prinzip genau dem was ich vorher über den ObjectToSoap part gelöst hatte, aber warum doppelten Code pflegen? Also weg mit meinerm Krahm :)

In der WSDL Unit wird automatisch eine entsprechende Headerklasse generiert und dann mit

Delphi-Quellcode:
 
InvRegistry.RegisterHeaderClass(TypeInfo(wsKostenstelleObj), wsKostenstelleID, 'wsKostenstelleID', 'virrpcKostenstelle/wsKostenstelle');
InvRegistry.RegisterHeaderClass(TypeInfo(kostenstelleObj), kostenstelleID, 'kostenstelleID', 'virrpcKostenstelle/kostenstelle');
"angebunden".

Das Einzige was ich noch machen musste, war mir die UUID und die Anwendungsspeziefischen Fehlermeldungen aus der Responce rausziehen. Das hab ich über das AfterExecute Event des übergebnen tHTTPRIO objekts gelöst.
Delphi-Quellcode:
procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string; SOAPResponse: TStream);
var
  lSL: tstringlist;
  I: Integer;
  lXMLDoc: IXMLDocument;
begin
  lXMLDoc:= TXMLDocument.Create(nil);
  lXMLDoc.LoadFromStream(SOAPResponse);

  SOAPErrorMessage:=RecursiveFindNode(lXMLDOC.DocumentElement,'errorMessage');

  case IndexText(MethodName,['Connect_wsKostenstelle','CreatePO_kostenstelle']) of
    0: WebserviceUUID:=RecursiveFindNode(lXMLDOC.DocumentElement,'UUID');
    1: CSPortUUID :=RecursiveFindNode(lXMLDOC.DocumentElement,'UUID');
  end;
end;
Die RecursiveFindNode hab ich aus folgendem Stackoverflow Eintrag
Falls jemand sowohl für das RecursiveFindNode als auch den Ansatz die Responce aus dem Event auszulösen was zu meckern hat :) gern immer her damit.
Bin immer offen für konstruktive Kritik.:wink:

Bis dahin, super vielen Dank für die Hilfe. @Incocnito - Das mit dem > war üübrigens kein Problem, funktioniert ohne Probleme. Vielleicht weils nochmal gekapselt ist in verschiedenen Nodes, aber wie gesagt XML und ich sind nicht die besten Freunde? :)

MFG
PJM


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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