Codebeispiel für Web-Services
Das WSDL-Beispiel (Web Services Description Language) und die Code-Snippets in diesem Artikel veranschaulichen, wie zur Programmierung einer Mediation auf Felder in einer Web-Service-Nachricht zugegriffen wird.
Definition von Web-Service-Nachrichten
Dieser Artikel enthält ein Beispiel für eine Web-Service-Nachricht. Die Eigenschaften einer Nachricht werden in WSDL, einer XML-basierten Sprache definiert, die zur Beschreibung der von einem Geschäft angebotenen Services verwendet wird und festlegt, wie der Zugriff auf diese Services erfolgt.
In diesem Artikel wird veranschaulicht, wie Mediations programmiert werden, sodass sie mit verschiedenen Teilen einer Web-Service-Nachricht arbeiten, die zusammen mit der Darstellung Service Data Objects (SDO) Version 1 im Artikel Zuordnung von SDO-Datengraphen für Web-Service-Nachrichten beschrieben werden. Für jeden Teil der Nachricht gibt es eine XML-Darstellung der Nachricht, die den entsprechenden SDO-Datengraphen darstellt. Zu jeder XML-Beschreibung gibt es Code-Snippets, die veranschaulichen, wie mit diesem Nachrichtenteil gearbeitet wird.
Im Folgenden sehen Sie die WSDL-Beschreibung der Nachricht, die zur Veranschaulichung der nachfolgenden Code-Snippets verwendet wird:
Beschreibung der Web-Service-Nachricht companyInfo
<wsdl:definitions targetNamespace="http://example.companyInfo"
xmlns:tns="http://example.companyInfo"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdlmime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xsd:schema elementFormDefault="qualified"
targetNamespace="http://example.header">
<xsd:element name="sampleHeader">
<xsd:complexType>
<xsd:all>
<xsd:element name="priority" type="xsd:int"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<xsd:schema elementFormDefault="qualified"
targetNamespace="http://example.companyInfo">
<xsd:element name="getCompanyInfo">
<xsd:complexType>
<xsd:all>
<xsd:element name="tickerSymbol" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:element name="getCompanyInfoResult">
<xsd:complexType>
<xsd:all>
<xsd:element name="result" type="xsd:float"/>
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="getCompanyInfoRequest">
<wsdl:part name="part1" element="tns:getCompanyInfo"/>
</wsdl:message>
<wsdl:message name="getCompanyInfoResponse">
<wsdl:part name="part1" element="tns:getCompanyInfoResult"/>
<wsdl:part name="part2" type="xsd:string"/>
<wsdl:part name="part3" type="xsd:base64Binary"/>
</wsdl:message>
<wsdl:portType name="CompanyInfo">
<wsdl:operation name="GetCompanyInfo">
<wsdl:input message="tns:getCompanyInfoRequest"
name="getCompanyInfoRequest"/>
<wsdl:output message="tns:getCompanyInfoResponse"
name="getCompanyInfoResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="CompanyInfoBinding" type="tns:CompanyInfo">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="GetCompanyInfo">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCompanyInfoRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCompanyInfoResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="CompanyInfoService">
<wsdl:port binding="tns:CompanyInfoBinding" name="SOAPPort">
<wsdlsoap:address location="http://somewhere/services/CompanyInfoService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Mit dem Knoten info arbeiten
<env:Envelope
xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ns1='http://example.companyInfo'>
<env:Body>
<ns1:getCompanyInfo>
<ns1:tickerSymbol>IBM</ns1:tickerSymbol>
</ns1:getCompanyInfo>
</env:Body>
</env:Envelope>
// Knoten info abrufen (ein untergeordnetes Element des Stammobjekts des Graphen)
DataObject rootNode = graph.getRootObject();
DataObject infoNode = rootNode.getDataObject("Info");
// operationName und messageType abfragen
String opName = infoNode.getString("operationName");
String type = infoNode.getString("messageType");
Header bearbeiten
<env:Envelope
xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ns1='http://example.companyInfo'>
<env:Header>
<example:sampleHeader
env:mustUnderstand='1'
xmlns:example='http://example.header'>
<example:priority>4</example:priority>
</example:sampleHeader>
</env:Header>
<env:Body>
<ns1:getCompanyInfo>
<ns1:tickerSymbol>IBM</ns1:tickerSymbol>
</ns1:getCompanyInfo>
</env:Body>
</env:Envelope>
// Knoten info abrufen (ein untergeordnetes Element des Stammobjekts des Graphen)
DataObject rootNode = graph.getRootObject();
DataObject infoNode = rootNode.getDataObject("Info");
// Auf die Liste der Header zugreifen
List headerEntries = infoNode.getList("headers");
// Ersten Eintrag aus der Liste abrufen
DataObject headerEntry = (DataObject) headerEntries.get(0);
// Eigenschaft mustUnderstand des Headereintrags abrufen
boolean mustUnderstand = headerEntry.getBoolean("mustUnderstand");
// Sequenz abrufen, die den Inhalt des Headereintrags enthält
Sequence headerContent = headerEntry.getSequence("any");
// Ersten Teil des Inhalts aus der Sequenz abrufen
DataObject header = (DataObject) headerContent.getValue(0);
// Priorität aus dem Header lesen
int priority = header.getInt("priority");
// Kurzschrift für obige Anweisungen unter Verwendung von SDO-Pfadausdrücken,
// die beim Knoten info anfangen
mustUnderstand = infoNode.getBoolean("headers[1]/mustUnderstand");
priority = infoNode.getInt("headers[1]/any[1]/priority");
Einen Anhang bearbeiten
Content-Type: multipart/related; start="<start>"; boundary="boundary"
--boundary
Content-Type: text/xml
Content-Transfer-Encoding: 7bit
Content-ID: <start>
<env:Envelope
xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ns1='http://example.companyInfo'>
<env:Body>
<ns1:getCompanyInfo>
<ns1:tickerSymbol>IBM</ns1:tickerSymbol>
</ns1:getCompanyInfo>
</env:Body>
</env:Envelope>
--boundary
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-ID: <myAttachment>
<info>Some attached information</info>
--boundary--
// Knoten info abrufen (ein untergeordnetes Element des Stammobjekts des Graphen)
DataObject rootNode = graph.getRootObject();
DataObject infoNode = rootNode.getDataObject("Info");
// Auf die Liste der Anhänge zugreifen
List attachmentEntries = infoNode.getList("attachments");
// Ersten Eintrag aus der Liste abrufen
DataObject attachmentEntry = (DataObject) attachmentEntries.get(0);
// Eigenschaft contentId des Headereintrags abfragen
String contentId = attachmentEntry.getString("contentId");
// Im Anhang enthaltene Daten abrufen
byte[] data = attachmentEntry.getBytes("data");
Nachrichtenhauptteil (Body) bearbeiten
<env:Envelope
xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ns1='http://example.companyInfo'>
<env:Body>
<ns1:getCompanyInfo>
<ns1:tickerSymbol>IBM</ns1:tickerSymbol>
</ns1:getCompanyInfo>
</env:Body>
</env:Envelope>
// Knoten info abrufen (ein untergeordnetes Element des Stammobjekts des Graphen)
DataObject rootNode = graph.getRootObject();
DataObject infoNode = rootNode.getDataObject("Info");
// Knoten body abrufen
DataObject bodyNode = infoNode.getDataObject("body");
// Datenobjekt für den ersten Teil des Body abrufen
DataObject part1Node = bodyNode.getDataObject("part1");
// tickerSymbol abfragen
String ticker = part1Node.getString("tickerSymbol");
// Kurzschrift für obige Anweisungen unter Verwendung eines SDO-Pfadausdrucks.
// der beim Knoten info anfängt
ticker = infoNode.getString("body/part1/tickerSymbol");