Der SQL Anywhere-Server als Webdienstclient kann sich mit einer Funktion oder Prozedur mit einem Webdienst verbinden.
Eine Zeichenfolgendarstellung in einer Ergebnismenge kann für einfache Rückgabe-Datentypen ausreichen. Die Verwendung einer gespeicherten Prozedur kann in diesem Fall geeignet sein.
Für die Rückgabe komplexer Daten wie etwa Arrays oder Strukturen ist der Einsatz von Webdienstfunktionen vorzuziehen. Bei Funktionsdeklarationen kann die RETURN-Klausel einen XML-Datentyp angeben. Der zurückgegebene XML-Code kann mit OPENXML analysiert werden, um die gewünschten Elemente zu extrahieren.
Beachten Sie, dass die Rückgabe von XML-Daten wie etwa dateTime innerhalb der Ergebnismenge wortgetreu erfolgt. Falls beispielsweise eine TIMESTAMP-Spalte in einer Ergebnismenge enthalten ist, wird sie als XML-Zeichenfolge des Typs dateTime formatiert (2006-12-25T12:00:00.000-05:00), nicht als Zeichenfolge (2006-12-25 12:00:00.000).
Der SQL Anywhere XML-Datentyp wird für die Verwendung als Parameter innerhalb von Webdienstfunktionen und -prozeduren unterstützt. Für einfache Typen wird das Parameterelement automatisch erstellt, wenn der Hauptteil für die SOAP-Anforderung generiert wird. Für Parameter des Typs XML kann dies jedoch nicht durchgeführt werden, da die XML-Darstellung des Elements möglicherweise Attribute benötigt, die zusätzliche Daten bereitstellen. Daher muss der Name des Stammelements dem Parameternamen entsprechen, wenn XML für einen Parameter generiert wird, dessen Datentyp XML ist.
<inputHexBinary xsi:type="xsd:hexBinary">414243</inputHexBinary> |
Der XML-Typ zeigt, wie ein Parameter als XML-Typ hexBinary gesendet wird. Der SOAP-Endpunkt erwartet, dass der Parametername (oder in der XML-Terminologie der Stammelementname) inputHexBinary ist.
Um komplexe Strukturen und Arrays zu erstellen, sind Kenntnisse der SQL Anywhere-Referenz-Namespaces erforderlich. Die hier aufgeführten Präfixe entsprechen den Namespace-Deklarationen, die für einen SQL Anywhere SOAP-Anforderungsrahmen generiert wurden.
SQL Anywhere-XML-Präfix | Namespace |
---|---|
xsd | http://www.w3.org/2001/XMLSchema |
xsi | http://www.w3.org/2001/XMLSchema-Instanz |
SOAP-ENC | http://schemas.xmlsoap.org/soap/encoding/ |
m | Namespace, wie in der NAMESPACE-Klausel definiert |
Mit den folgenden drei Beispielen wird gezeigt, wie Webdienstclientfunktionen mit Parametern erstellt werden, die ein Array, eine Struktur und ein Array von Strukturen darstellen. Die Webdienstfunktionen kommunizieren mit den SOAP-Operationen (oder RPC-Funktionsnamen) echoFloatArray, echoStruct und echoStructArray. Der gemeinsame Namespace für Systemoffenheitstests ist http://soapinterop.org/. Er macht es möglich, eine bestimmte Funktion mit alternativen Systemoffenheitsservern zu testen, indem einfach die URL-Klausel in den ausgewählten SOAP-Endpunkt geändert wird.
Diese Beispiele wurden erstellt, um Anforderungen an den SOAP ToolKit 3.0 Round 2-Systemoffenheits-Testserver von Microsoft
unter http://mssoapinterop.org/stkV3 zu stellen.
Alle Beispiele verwenden eine Tabelle zum Generieren der XML-Daten. Im folgenden Abschnitt wird gezeigt, wie diese Tabelle eingerichtet wird.
CREATE LOCAL TEMPORARY TABLE SoapData ( seqno INT DEFAULT AUTOINCREMENT, i INT, f FLOAT, s LONG VARCHAR ) ON COMMIT PRESERVE ROWS; INSERT INTO SoapData (i,f,s) VALUES (99,99.999,'Ninety-Nine'); INSERT INTO SoapData (i,f,s) VALUES (199,199.999,'Hundred and Ninety-Nine'); |
Die folgenden drei Funktionen senden SOAP-Anforderungen an den Systemoffenheitsserver. Beachten Sie, dass dieses Beispiel Anforderungen an den Microsoft Soap Interop Server sendet:
CREATE FUNCTION echoFloatArray(inputFloatArray XML) RETURNS XML URL 'http://mssoapinterop.org/stkV3/Interop.wsdl' HEADER 'SOAPAction:"http://soapinterop.org/"' NAMESPACE 'http://soapinterop.org/'; CREATE FUNCTION echoStruct(inputStruct XML) RETURNS XML URL 'http://mssoapinterop.org/stkV3/Interop.wsdl' HEADER 'SOAPAction:"http://soapinterop.org/"' NAMESPACE 'http://soapinterop.org/'; CREATE FUNCTION echoStructArray(inputStructArray XML) RETURNS XML URL 'http://mssoapinterop.org/stkV3/Interop.wsdl' HEADER 'SOAPAction:"http://soapinterop.org/"' NAMESPACE 'http://soapinterop.org/'; |
Abschließend werden die drei Beispielanweisungen zusammen mit der XML-Darstellung ihrer Parameter gezeigt:
Die Parameter im folgenden Beispiel stellen ein Array dar.
SELECT echoFloatArray( XMLELEMENT( 'inputFloatArray', XMLATTRIBUTES( 'xsd:float[2]' as "SOAP-ENC:arrayType" ), ( SELECT XMLAGG( XMLELEMENT( 'number', f ) ORDER BY seqno ) FROM SoapData ) ) ); |
Die gespeicherte Prozedur echoFloatArray sendet den folgenden XML-Code an den Systemoffenheitsserver.
<inputFloatArray SOAP-ENC:arrayType="xsd:float[2]"> <number>99.9990005493164</number> <number>199.998992919922</number> </inputFloatArray> |
Der Systemoffenheitsserver liefert folgende Antwort.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAPSDK4:echoFloatArrayResponse xmlns:SOAPSDK4="http://soapinterop.org/"> <Result SOAPSDK3:arrayType="SOAPSDK1:float[2]" SOAPSDK3:offset="[0]" SOAPSDK2:type="SOAPSDK3:Array"> <SOAPSDK3:float>99.9990005493164</SOAPSDK3:float> <SOAPSDK3:float>199.998992919922</SOAPSDK3:float> </Result> </SOAPSDK4:echoFloatArrayResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Falls die Anwort in einer Variablen gespeichert wurde, kann sie mit OPENXML analysiert werden.
SELECT * FROM openxml( resp,'//*:Result/*' ) WITH ( varFloat FLOAT 'text()' ); |
varFloat |
---|
99.9990005493 |
199.9989929199 |
Die Parameter im folgenden Beispiel stellen eine Struktur dar.
SELECT echoStruct( XMLELEMENT('inputStruct', ( SELECT XMLFOREST( s as varString, i as varInt, f as varFloat ) FROM SoapData WHERE seqno=1 ) ) ); |
Die gespeicherte Prozedur echoStruct sendet den folgenden XML-Code an den Systemoffenheitsserver.
<inputStruct> <varString>Ninety-Nine</varString> <varInt>99</varInt> <varFloat>99.9990005493164</varFloat> </inputStruct> |
Der Systemoffenheitsserver liefert folgende Antwort.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAPSDK4:echoStructResponse xmlns:SOAPSDK4="http://soapinterop.org/"> <Result href="#id1"/> </SOAPSDK4:echoStructResponse> <SOAPSDK5:SOAPStruct xmlns:SOAPSDK5="http://soapinterop.org/xsd" id="id1" SOAPSDK3:root="0" SOAPSDK2:type="SOAPSDK5:SOAPStruct"> <varString>Ninety-Nine</varString> <varInt>99</varInt> <varFloat>99.9990005493164</varFloat> </SOAPSDK5:SOAPStruct> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Falls die Anwort in einer Variablen gespeichert wurde, kann sie mit OPENXML analysiert werden.
SELECT * FROM openxml( resp,'//*:Body/*:SOAPStruct' ) WITH ( varString LONG VARCHAR 'varString', varInt INT 'varInt', varFloat FLOAT 'varFloat' ); |
varString | varInt | varFloat |
---|---|---|
Ninety-Nine | 99 | 99.9990005493 |
Die Parameter im folgenden Beispiel stellen ein Array von Strukturen dar.
SELECT echoStructArray( XMLELEMENT( 'inputStructArray', XMLATTRIBUTES( 'http://soapinterop.org/xsd' AS "xmlns:q2", 'q2:SOAPStruct[2]' AS "SOAP-ENC:arrayType" ), ( SELECT XMLAGG( XMLElement('q2:SOAPStruct', XMLFOREST( s as varString, i as varInt, f as varFloat ) ) ORDER BY seqno ) FROM SoapData ) ) ); |
Die gespeicherte Prozedur echoFloatArray sendet den folgenden XML-Code an den Systemoffenheitsserver.
<inputStructArray xmlns:q2="http://soapinterop.org/xsd" SOAP-ENC:arrayType="q2:SOAPStruct[2]"> <q2:SOAPStruct> <varString>Ninety-Nine</varString> <varInt>99</varInt> <varFloat>99.9990005493164</varFloat> </q2:SOAPStruct> <q2:SOAPStruct> <varString>Hundred and Ninety-Nine</varString> <varInt>199</varInt> <varFloat>199.998992919922</varFloat> </q2:SOAPStruct> </inputStructArray> |
Der Systemoffenheitsserver liefert folgende Antwort.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAPSDK4:echoStructArrayResponse xmlns:SOAPSDK4="http://soapinterop.org/"> <Result xmlns:SOAPSDK5="http://soapinterop.org/xsd" SOAPSDK3:arrayType="SOAPSDK5:SOAPStruct[2]" SOAPSDK3:offset="[0]" SOAPSDK2:type="SOAPSDK3:Array"> <SOAPSDK5:SOAPStruct href="#id1"/> <SOAPSDK5:SOAPStruct href="#id2"/> </Result> </SOAPSDK4:echoStructArrayResponse> <SOAPSDK6:SOAPStruct xmlns:SOAPSDK6="http://soapinterop.org/xsd" id="id1" SOAPSDK3:root="0" SOAPSDK2:type="SOAPSDK6:SOAPStruct"> <varString>Ninety-Nine</varString> <varInt>99</varInt> <varFloat>99.9990005493164</varFloat> </SOAPSDK6:SOAPStruct> <SOAPSDK7:SOAPStruct xmlns:SOAPSDK7="http://soapinterop.org/xsd" id="id2" SOAPSDK3:root="0" SOAPSDK2:type="SOAPSDK7:SOAPStruct"> <varString>Hundred and Ninety-Nine</varString> <varInt>199</varInt> <varFloat>199.998992919922</varFloat> </SOAPSDK7:SOAPStruct> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Falls die Anwort in einer Variablen gespeichert wurde, kann sie mit OPENXML analysiert werden.
SELECT * FROM openxml( resp,'//*:Body/*:SOAPStruct' ) WITH ( varString LONG VARCHAR 'varString', varInt INT 'varInt', varFloat FLOAT 'varFloat' ); |
varString | varInt | varFloat |
---|---|---|
Ninety-Nine | 99 | 99.9990005493 |
Hundred and Ninety-Nine | 199 | 199.9989929199 |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |