wake-up-neo.net

WSDL aus einer XSD-Datei generieren

Ich muss eine WSDL-Datei mit einer XSD-Datei erstellen. Wie mache ich das? Kann ich das in VS2005 machen? Was ist der einfachste Weg, dies zu tun?

34
Ausgar

Sie können nicht - eine XSD beschreibt die DATA-Aspekte, z. eines Webservice - die WSDL beschreibt die FUNKTIONEN der Webservices (Methodenaufrufe). Sie können die Methodenaufrufe normalerweise nicht allein aus Ihren Daten ermitteln.

Dies sind zwei getrennte, charakteristische Teile der Gleichung. Der Einfachheit halber importieren Sie häufig Ihre XSD-Definitionen im Tag <wsdl:types> in die WSDL.

(Danke an Cheeso für den Hinweis auf meine unrichtige Verwendung der Begriffe)

47
marc_s

Ich möchte mich hier mit marc_s unterscheiden, der schrieb: 

eine XSD beschreibt die DATA-Aspekte, z. eines Webservice - die WSDL beschreibt die FUNKTIONEN der Webservices (Methodenaufrufe). Sie können normalerweise nicht ermitteln Sie die Methodenaufrufe von Ihrem Daten allein.

WSDL beschreibt keine Funktionen. WSDL definiert eine Netzwerkschnittstelle, die selbst aus Endpunkten besteht, die Nachrichten abrufen und manchmal mit Nachrichten antworten. WSDL beschreibt die Endpunkte sowie die Anforderungs- und Antwortnachrichten. Es ist sehr nachrichtenorientiert.

WSDL wird häufig als eine Reihe von Funktionen betrachtet. Dies liegt jedoch daran, dass die Webservice-Tools normalerweise clientseitige Proxys generieren, die die WSDL-Vorgänge als Methoden oder Funktionsaufrufe verfügbar machen. Die WSDL erfordert dies jedoch nicht. Dies ist ein Nebeneffekt der Werkzeuge.

EDIT: Im allgemeinen Fall definiert XSD keine Datenaspekte eines Web-Services. XSD definiert die Elemente, die in einem kompatiblen XML-Dokument enthalten sein können. Ein solches Dokument kann als Nachricht über einen Web-Service-Endpunkt ausgetauscht werden, muss es aber nicht sein. 


Um auf die Frage zurückzukommen, würde ich die ursprüngliche Frage etwas anders beantworten. Ich würde sagen JA, es ist möglich , eine WSDL-Datei mit einer xsd-Datei zu erzeugen, auf dieselbe Weise, wie es möglich ist, ein Omelett aus Eiern zu erzeugen. 

EDIT: Meine ursprüngliche Antwort war unklar. Lass mich es nochmal versuchen. Ich schlage nicht vor, dass XSD WSDL entspricht, oder dass eine XSD ausreicht, um WSDL zu erzeugen. Ich sage, dass es möglich ist, eine WSDL mit einer XSD-Datei zu generieren}, wenn mit diesem Ausdruck "WSDL mit einer XSD-Datei erzeugen" gemeint ist. Auf diese Weise erweitern Sie die Informationen in der XSD-Datei, um die WSDL zu generieren. Sie müssen zusätzliche Dinge definieren - Nachrichtenteile, Vorgänge, Porttypen - keines davon ist in der XSD vorhanden. Mit etwas kreativem Aufwand ist es jedoch möglich, "eine WSDL bei einer XSD zu generieren". 

Wenn der Ausdruck "Generieren einer WSDL bei einer XSD" als "mechanische Umwandlung einer XSD in eine WSDL" verstanden wird, lautet die Antwort NEIN. Dies ist nicht möglich. Dies sollte angesichts meiner obigen Beschreibung der WSDL klar sein. 

Beim Generieren einer WSDL mit einer XSD-Datei führen Sie normalerweise Folgendes aus (beachten Sie die kreativen Schritte in diesem Verfahren):

  1. importieren Sie das XML-Schema in die WSDL (Element wsdl: types).
  2. fügen Sie den Satz von Typen oder Elementen mit zusätzlichen Elementen oder Wrappern (sagen wir Arrays oder Strukturen, die die Basistypen enthalten) hinzu. Das Ergebnis von # 1 und # 2 umfasst alle Typen, die von der WSDL verwendet werden.
  3. definieren Sie eine Reihe von In- und Out-Meldungen (und möglicherweise Fehlern) anhand dieser zuvor definierten Typen.
  4. Definieren Sie einen Porttyp, dh eine Sammlung von Paarungen von in.out-Nachrichten. Sie können sich den Port-Typ als WSDL-Analogie zu einer Java-Schnittstelle vorstellen.
  5. Geben Sie eine Bindung an, die den Porttyp implementiert und definiert, wie Nachrichten serialisiert werden. 
  6. Geben Sie einen Dienst an, der die Bindung implementiert.

Der größte Teil der WSDL ist mehr oder weniger stark begrenzt. Es kann einschüchternd wirken, aber das liegt hauptsächlich an diesen gruseligen und reichlich vorhandenen spitzen Klammern, die ich gefunden habe. 

Einige haben angedeutet, dass dies ein langwieriger manueller Prozess ist. Könnte sein. Auf diese Weise können Sie interoperable Dienste erstellen. Sie können auch Werkzeuge zum Definieren von WSDL verwenden. Das dynamische Generieren von WSDL aus Code führt zu Interop-Fallstricken. 

26
Cheeso

Ich weiß, dass diese Frage alt ist, aber sie verdient eine Antwort. Ich persönlich bevorzuge es, eine WSDL von Hand zu erstellen und mit SoapUI die Konformität zu testen. Aber manchmal (besonders für komplexe WSDLs) haben Sie drei Möglichkeiten, eine aus einer XSD zu generieren:

  1. Generieren einer WSDL aus einem Schema mit Eclipse (wahrscheinlich das benutzerfreundlichste)
  2. Erzeugen einer WSDL über CXF (mein Favorit)
  3. Generieren einer WSDL durch Konventionen mit Spring WS (mein Favorit)

Ich bevorzuge den CXF-Ansatz, da ich ein CLI-Typ bin. Wenn es eine CLI hat, können Sie automatisieren (das ist mein Motto). Ich mag den Spring WS-Ansatz am wenigsten, da er viele rahmenspezifische Konventionen verwendet. 

Es gibt mehr Leute, die CXF kennen (glaube ich) als Spring WS. Alles, was eine neue Lernkurve für einen neuen Ingenieur auslösen kann (ohne klaren Vorteil oder ROI), ist etwas, das mich stört.

Es sollte auch nicht gesagt werden, dass jede generierte WSDL auf Gültigkeit und Kompatibilität getestet werden sollte (und angepasst werden muss, bis sie den Anforderungen entspricht) und dass Ihre Anwendung eine statische WSDL veröffentlicht (im Gegensatz zur Rückgabe einer automatisch generierten WSDL).

Ich habe die Erfahrung gemacht, dass Sie mit einem WS-I-kompatiblen WSDL beginnen, und dann generiert Ihre Anwendung automatisch ein nicht-kompatibles (und gibt dieses an den Konsumenten zurück). 

Mit anderen Worten, hüten Sie sich vor Auto-Magie.

6
luis.espinal

Dieses Tool xsd2wsdl Teil des Apache CXF-Projekts, das eine minimalistische WSDL generiert. 

3
Vishnu

Persönlich (und was ich weiß, z. B. Java und Achse), würde ich aus den .xsd-Dateien ein Java-Datenmodell generieren (Axis 2 kann dies tun) und dann eine Schnittstelle hinzufügen, um meinen Webservice zu beschreiben, der dieses Modell verwendet und generieren Sie dann eine WSDL von dieser Schnittstelle.

Da .NET auch über alle diese Funktionen verfügt, muss dies auch in diesem Ökosystem möglich sein.

0
JeeBee

wir können eine wsdl-Datei aus xsd generieren, aber Sie müssen das Oracle Enterprise Pack von Eclipse (OEPE) verwenden.