SOAP-Webservice im RPC-Stil bereitstellen
Wie Sie mit der X4 BPMS einen Technical Process als SOAP-Webservice im RPC-Stil bereitstellen, der zudem eine automatisch aus der Service-Konfiguration erzeugte WSDL-Definition bereitstellt, wird im Folgenden beschrieben.
Voraussetzungen:
- Grundlegendes Wissen über den Aufbau von SOAP-Webservices im RPC-Stil
- Ein Technical Process pro Webservice-Operation, der die Verarbeitung der eingehenden Anfrage übernimmt. Der Tehnical Process wird dabei über seine
x4db:/-URL
referenziert. - Ein URL-Part, über den der SOAP-Webservice via HTTP erreichbar sein soll, z.B. über
http://localhost:8080/X4/httpstarter/ReST/MyRPCWebservice
. Diesen URL-Part haben Sie bereits typischerweise als Konstante innerhalb der Webservices-Konfiguration definiert.
Um einen Technical Process als SOAP-Webservice im RPC-Stil bereitzustellen, gehen Sie wie folgt vor:
Unter der gewünschten URL-Ressource (definiert z.B. durch einen konstanten URL-Part) über das Kontextmenü Add SOAP Service einen neuen Service-Eintrag vom Typ
SOAP
anlegen.SOAP-Version festlegen (entweder SOAP 1.1, SOAP 1.2 oder Unterstützung für beide Standards).
WSDL-Modus in WSDL Mode und Zielpräfix in Service Prefix wählen.
Für jede Operation folgende Konfiguration hinterlegen:
- Einen gültigen Namen für die Operation hinterlegen.
SOAP-Webservices im RPC-Stil erfordern eindeutige Localnames für die Operationen.
Technical Process, der die Webservice-Anfrage über den X4 Server verarbeitet, über dessen
x4db:/-URL
verknüpfen.Im Webservice Configuration Editor ist dies per Drag & Drop aus dem Repository Navigator möglich.
Input Handler und Output Handler für den SOAP-Webservice definieren.
Beispiel:SOAP-Content
definieren, um das erste Element imsoap:Body
als Input zu verwenden sowie beim Output einsoap:Body
- undsoap:Envelope
-Element zu erzeugen.Erwartete Input-XML-Datenstruktur innerhalb von Element
<Input>
angeben, optional mit XML-Schemadefinition.Zu erzeugende Ausgabe-Datenstruktur innerhalb von Element
<Output>
angeben.
- Einen gültigen Namen für die Operation hinterlegen.
- Speichern und Webservice-Konfiguration mit Reload on Server anwenden.
Der SOAP-Webservice im RPC-Stil ist ab sofort aktiv.
Generierte WSDL-Definitionen im RPC
Die automatisch generierte zugehörige WSDL-Definition verwendet den RPC
-Stil und wird bei einem HTTP-GET-Aufruf des SOAP-Webservice-URIs ausgeliefert.
Für den WSDL-Modus RPC
erzeugt der X4 Server eine WSDL-Definition aus der Service-Konfiguration. Die WSDL-Definition wird wie folgt erstellt:
- Für jedes Namespace-Element mit
schemaLocation
-Attribut wird unterwsdl:types
einxsd:schema
mitxsd:include
für dieschemaLocation
erzeugt. - Für jede Operation wird eine
wsdl:message
erzeugt, deren Name dem Localname der konfigurierten Operation entspricht. Innerhalb dieser Message wird für jedesInput
-Part ein entsprechendeswsdl:part
erstellt. - Für jede Operation wird eine
wsdl:message
erzeugt, deren Name dem Localname der konfigurierten Operation, ergänzt umResponse
, entspricht. Innerhalb dieser Nachricht wird für jedes Output-Part ein entsprechendeswsdl:part
erstellt. - Für jede Operation wird eine
wsdl:operation
und damit einwsdl:portTyp
erzeugt. Der Name derwsdl:operation
ist derLocalname der konfigurierten Operation. Als Input-/Output-Nachricht werden die oben erzeugten Nachrichten verwendet. - Je nach SOAP-Version werden entsprechende
wsdl:binding
s erzeugt (ausschließlichliteral
Bindings). Es wird immer eine leere SOAP-Action definiert. Bei SOAP-Webservices mit RPC-Stil wird für jede Operation eintargetNamespace
deklariert, falls der Operationsname ein Qualifiedname ist (d.h. ein Name mit Doppelpunkt).
Beispiel: Konfiguration eines SOAP-Webservices im RPC-Modus
<Service type="Soap">
<SoapVersion>
<SOAP11/>
<SOAP12/>
</SoapVersion>
<Wsdl name="NameOfTheRpcService" targetPrefix="service" mode="RPC"/>
<Namespace prefix="service" namespace="http://example.org/serviceSpace"/>
<Namespace prefix="exampleSpace" namespace="http://example.org/namespace"
schemaLocation="http://localhost:8080/X4/httpstarter/ReST/soapService/xsd/namespace.xsd"/>
<Namespace prefix="anotherSpace" namespace="http://example.org/different/namespace"
schemaLocation="http://localhost:8080/X4/httpstarter/ReST/soapService/xsd/differentNamespace.xsd"/>
<!-- RPC requires unique localnames for the operations -->
<Operation name="exampleSpace:RpcOp1"
process="x4db:/1/RestExamples/soap/DirectOutput.wrf">
<InputHandler type="SOAP-Envelope"/>
<OutputHandler type="SOAP-Envelope"/>
<Input>
<Part name="firstPart" element="exampleSpace:Operation1"/>
</Input>
<Output>
<Part name="firstPart" element="exampleSpace:Operation1"/>
</Output>
</Operation>
<Operation name="anotherSpace:RpcOp2"
process="x4db:/1/RestExamples/soap/DirectOutput.wrf">
<InputHandler type="SOAP-Envelope"/>
<OutputHandler type="SOAP-Envelope"/>
<Input>
<Part name="firstPart" type="anotherSpace:SomeType"/>
</Input>
<Output>
<Part name="Output" type="anotherSpace:SomeType"/>
</Output>
</Operation>
<Operation name="RpcOp3"
process="x4db:/1/RestExamples/soap/DirectOutput.wrf">
<InputHandler type="SOAP-Envelope"/>
<OutputHandler type="SOAP-Envelope"/>
<Input>
<Part name="Value" type="xsd:integer"/>
</Input>
<Output>
<Part name="Value" type="xsd:String"/>
</Output>
</Operation>
</Service>