Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition (https://www.delphipraxis.net/189681-soap-wsdl-enthaelt-gleichnamige-schluessel-mit-unterschiedlicher-definition.html)

danielA 8. Jul 2016 15:19

SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Hallo Liebe Delphigemeinde,

ich habe eine wsdl- Datei erhalten, für welche ein Client implementiert werden soll.
Ich habe derzeit keinen Zugriff auf den Server, welcher das dann tatsächlich ausführen soll, deshalb kann ich nicht "real" testen, sondern nur mit meinem eigens implementierten Server.

Die Implementierung der Schnittstelle ist soweit auch abgeschlossen, ich habe jedoch ein Problem mit einem Datentyp.

Delphi-Quellcode:
  IMEINInterface = interface(IInvokable)
  ['{C02AF8D7-960D-49A0-BCDE-BCB2EF73E8AC}']
    function MeineMethode(const Abfrage: TAbfrage): TAntwort; stdcall;
  end;
Soweit alles in Ordnung.
Jetzt habe ich aber das Problem, dass in den Klassen TAbfrage und TAntwort jeweils ein property vom Typ TWerte enthalten ist. Die Propertys von TWerte unterscheiden sich aber gänzlich. Mir ist klar, dass ich bei der Registrierung der WSDL-Typen Umbenennungen vornehmen kann. Dennoch müßte dann ja z.B. sowas gemacht werden.

Delphi-Quellcode:

initialization

  ...
  RemClassRegistry.RegisterXSClass(TWerteAbfrage, 'urn:IMEINInterfaceServiceIntf', 'TWerteAbfrage', 'TWerte');
  RemClassRegistry.RegisterXSClass(TWerteAntwort, 'urn:IMEINInterfaceServiceIntf', 'TWerteAntwort', 'TWerte');
  ...
end.
So kann ich zwar innerhalb Delphi's die Definitionen trennen aber schafft RegisterXSClass tatsächlich die Verlinkung auf das Richtige Unterelment?

Vielen Dank und Gruß,

Daniel

mjustin 8. Jul 2016 18:20

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Hat der aus der WSDL generierte Delphi-Code denn auch zwei verschiedene Implementierungen von TWerte, die zur WSDL passen?

Falls ja, würde ich den eigens implementierten Server auch mit den Aufrufen testen, die beide Varianten verwenden und den Aufruf client- und serverseitig debuggen, zum Beispiel mit Fiddler2 als HTTP Proxy.

danielA 11. Jul 2016 14:28

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Hallo Michael,

erstmal vielen Dank für Deine Antwort.

Ja, durch den Import wurden mir 2 Klassen importiert und registriert. Die Eine hieß TWerte und die andere TWerte2. die Registrierung im Initializationteil sah wie bereit unten angegeben aus.

Code:
initialization
  ...
  RemClassRegistry.RegisterXSClass(TWerteAbfrage, 'urn:IMEINInterfaceServiceIntf', 'TWerteAbfrage', 'TWerte');
  RemClassRegistry.RegisterXSClass(TWerteAntwort, 'urn:IMEINInterfaceServiceIntf', 'TWerteAntwort', 'TWerte');
  ...
end.
Ich habe lediglich die Klassen nach meinem Gusto umbenannt.
Im Testserver hätte ich das gerne genauso gemacht. RegisterXSClass scheint dort aber nicht zu greifen oder gibt es da einen anderen Befehl für? Lass ich mir den XML-Code anzeigen, so stehen da nämlich die tatsächlichen Klassennamen des Servers drin. Also TWerteAbfrage und TWerteAntwort anstelle von TWerte. Ansonsten funktionieren Testserver und Client anstandslos miteinander. Die Registrierung durch RegisterXSClass im Client lautet derzeit natürlich aber ebenfalls:

Code:
initialization

  ...
  RemClassRegistry.RegisterXSClass(TWerteAbfrage, 'urn:IMEINInterfaceServiceIntf', 'TWerteAbfrage', 'TWerteAbfrage');
  RemClassRegistry.RegisterXSClass(TWerteAntwort, 'urn:IMEINInterfaceServiceIntf', 'TWerteAntwort', 'TWerteAntwort');
  ...
end.

Ich denke, ich muß abwarten, bis meine Schnittstelle zum Test vom Kunden zur Verfügung steht und dann gegebenenfalls anpassen lassen. Zum Glück ist das keine externe Schnittstelle, sondern steht nur für unsere Software zur Verfügung. Ich denke da sollte das machbar sein. Ich hatte nur gehofft, das es da eine Möglichkeit gibt.

Vielen Dank noch einmal und viele Grüße,

Daniel

Sherlock 12. Jul 2016 07:36

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Was klappt denn nicht? Welchen Fehler bekommst Du? Du brauchst doch eigentlich in der Regel gar nichts an der generierten soap.pas zu drehen, es sei denn Du läufst explizit in Fehler rein. Hier steht aber bisher nichts von Fehlern.

Sherlock

danielA 12. Jul 2016 09:42

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Hallo Sherlock,

nein Fehler gibt es derzeit auch nicht.
Bei der Implementierung und beim Test ist mir lediglich aufgefallen, dass in der .WSDL ein Typ doppelt vorkommt, mit verschiedenen Eigenschaften (propertys).
Da ich derzeit nicht auf den Zielserver zugreifen kann (steht beim Kunden), geht es mir eigentlich nur darum zu erfahren, ob die Registrierung die Umleitung der Typen das schafft.

Also

Code:
initialization
  ...
  //                              [eigene Klasse]       [Server URL]            [eigener Klassenname][Name des Typs]
                                                                                   [    als String    ][  in WSDL   ]
  RemClassRegistry.RegisterXSClass(TWerteAbfrage, 'urn:IMEINInterfaceServiceIntf',     'TWerteAbfrage',    'TWerte'); // <- letzter Parameter doppelt vorhanden
  RemClassRegistry.RegisterXSClass(TWerteAntwort, 'urn:IMEINInterfaceServiceIntf',     'TWerteAntwort',    'TWerte'); // <- mit verschiedenen Definitionen
  ...
end.
oder anders als PseudoWSDL stark zusammengefasst:


Code:
             ...
         <xsd:element name="TObergruppe1">
             <xsd:element name="TWert">  // <- das Erste mal TWert
                <xsd:element name="Wert1" type="xsd:string">
                <xsd:element name="Wert2" type="xsd:string">
             </xsd:element>
         </xsd:element>

         <xsd:element name="TObergruppe2">
             <xsd:element name="TWert">  // <- und hier noch einmal
                <xsd:element name="Wert3" type="xsd:date">
                <xsd:element name="Wert4" type="xsd:string">
                <xsd:element name="Wert5" type="xsd:boolean">
                <xsd:element name="Wert6" type="xsd:integer">
                <xsd:element name="Wert7" type="xsd:string">
                <xsd:element name="Wert8" type="xsd:string">
             </xsd:element>
         </xsd:element>
           ...
Vielen Dank und Gruß,

Daniel

Sherlock 12. Jul 2016 10:21

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Wogegen testest Du? Sowas wie SoapUI hoffentlich, und nicht einem selbst gebauten Server Mockup?

Sherlock

danielA 13. Jul 2016 08:48

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Hallo Sherlock,

nein war/ist ein eigener Mockup.
Der Hinweis auf SoapUI ist aber echt Gold wert. Danke dafür.
Ich habe mein Problem zwar noch nicht ganz klären können, gehe aber momentan davon aus, dass doch nicht mit den Delphieigenen SOAP Komponenten/Importen laufen zu lassen, sondern die Anfrage direckt über HTTP POST zu senden und anschließend die XML-Antwort auszuwerten. SoapUI zeigt einem ja schon Haarklein, wie die Anfrage aussehen muß. Am Header muß ich noch basteln aber das bekomme ich noch hin. Auf jeden Fall hätte ich dann meine doppelten Typen, da das unter reinem XML, in der Form, kein Problem darstellen sollte. Die XSDs habe ich ja ebenfalls.

Die SOAP-Komponenten empfinde ich als sehr nett und man ist bestimmt in der Lage ein sich bereits bewährtes funktionierend sauberes System sehr schnell zu implementieren. Ich benötige jedoch möglichst viel flexibilität um schnell agieren zu können. Dafür erscheinen sie mir dann doch leider etwas zu undurchsichtig.

Vielen Dank noch einmal für Eure Hilfe, hat mir Echt geholfen.

viele Grüße,

Daniel

Sherlock 13. Jul 2016 09:11

AW: SOAP: wsdl enthält Gleichnamige Schlüssel mit unterschiedlicher Definition
 
Hmm, flexibel ist es eigentlich schon. Mußt halt lediglich bei jeder Änderung am wsdl neu importieren. Ich würde das alles nicht selbst machen wollen. Aber wenn Du soweit damit zurecht kommst, warum nicht? :D

Viel Erfolg weiterhin!

Sherlock


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