AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi SOAP WSDL Import ohne Header - Tokyo 10.2

SOAP WSDL Import ohne Header - Tokyo 10.2

Ein Thema von fisipjm · begonnen am 30. Sep 2019 · letzter Beitrag vom 7. Okt 2019
Antwort Antwort
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#1

SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 30. Sep 2019, 16:07
Hi

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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 30. Sep 2019, 16:31
Bei den von dir verlinkten "ähnlichen Problemen" wurden doch auch Lösungen aufgezeigt. Hast Du die mal durchgeschaut?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#3

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 1. Okt 2019, 07:24
Hi Union,

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?
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#4

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 2. Okt 2019, 13:42
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 jemand eine Idee?

Gruß
PJM
  Mit Zitat antworten Zitat
TiGü

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

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 2. Okt 2019, 14:58
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;
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#6

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 2. Okt 2019, 15:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 2. Okt 2019, 16:10
Hast Du in den THttpRio.Converter.Options [soLiteralParams] drin? Standard ist ja nur [soSendMultiRefObj, soRootRefNodesToBody, soTryAllSchema, soCacheMimeResponse, soUTF8EncodeXML]
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#8

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 4. Okt 2019, 07:07
...

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
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#9

AW: SOAP WSDL Import ohne Header - Tokyo 10.2

  Alt 7. Okt 2019, 13:56
Hey und willkommen zurück aus dem langen Wochenede

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.

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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:11 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