Schnittstellen WSDL Schnittstelle Geschätzte Lektüre: 11 Minuten Konzept Limbas bietet für jede Tabelle oder Abfrage einen eigenen WSDL-Service. Diese werden dynamisch erstellt und stellen wichtige Datenbankoperationen bereit. Um zum Beispiel die WSDL-Definition für die Tabelle Kunde anzufordern wird folgender Link benutzt: http://localhost/limbas/dependent/main_wsdl.php?Service=Kunden&WSDL. Hierbei ist zu beachten, dass der Tabellenname klein und mit großem Anfangsbuchstaben geschrieben wird. Außerdem werden die Zugriffsrechte über die WSDL-Schnittstelle auf einzelne Tabellen oder Felder gruppen-hierarchisch verwaltet. Es können Gruppen mit verschiedenen Rechten für unterschiedliche Anwendungsfälle erstellt werden. Enthält eine Tabelle Verknüpfungen, dann werden diese als Unterbaum in der XML-Ausgabe eines SOAP-Response dargestellt, falls auch hier die entsprechenden Rechte des Benutzers vorhanden sind. Eine Authentifizierung ist Pflicht und unterscheidet sich je nach Client. Unter Umständen kann die Authentifizierung auch über die URL durchgeführt werden (http://username:password@mydomain). Da Limbas ein Session-Konzept besitzt, werden WSDL Aufrufe grundsätzlich über eine feste User-Session behandelt. Um Änderungen an Tabellen oder Rechten zu aktivieren müssen diese Sessions sowie die SOAP cachingfiles gelöscht werden. Diese sind standardmäßig unter /tmp zu finden, kann aber in der php.ini angepasst werden. Funktionen query Mit der query-Funktion können Datensätze nach allen Elementen gefiltert werden. So können z.B. die Kunden in Mannheim mit folgender Anfrage abgerufen werden: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:query soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="urn:KundenQuery"> <ORT xsi:type="xsd:string">Mannheim</ORT> </params> </urn:query> </soapenv:Body> </soapenv:Envelope> Als Ergebnis werden alle entsprechenden Datensätze in XML ausgegeben: <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Kundenwsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:queryResponse> <return xsi:type="ns1:KundenArray"> <items xsi:type="ns1:Kunden"> <ID xsi:type="xsd:integer">6</ID> <NAME xsi:type="xsd:string">Blauer See Delikatessen</NAME> <NAME_ZUSATZ xsi:type="xsd:string"/> <STRASSE xsi:type="xsd:string">Forsterstr. 57</STRASSE> <ORT xsi:type="xsd:string">Mannheim</ORT> <PLZ xsi:type="xsd:string">68306</PLZ> <LAND xsi:type="xsd:string"/> <REGION xsi:type="xsd:string"/> <POSTFACH xsi:type="xsd:string"/> <TEL xsi:type="xsd:string">0621-08460</TEL> <MOBIL xsi:type="xsd:string"/> <FAX xsi:type="xsd:string">0621-08924</FAX> <EMAIL xsi:type="xsd:string"/> <WEB xsi:type="xsd:string"/> <ORTSPLAN xsi:type="xsd:string"/> <KORRESPONDENZ xsi:type="ns1:KorrespondenzArray"/> <SEL xsi:type="xsd:integer">0</SEL> <BOO xsi:type="xsd:boolean">false</BOO> </items> </return> </ns1:queryResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Die Funktion enthält außerdem folgende (optionale) Parameter, mit der die Abfrage und Ausgabe angepasst werden kann: q_orderby: Die Datensätze können nach dem hier angegebenen Element-Namen sortiert werden. q_rows: Gibt die Anzahl der Datensätze an, die pro Seite ausgegeben werden sollen. Standardmäßig sind dies 30. q_page: Gibt die Seitenzahl mit den Datensätzen an, die Limbas ausgeben soll. q_nolimit: Falls dieser Parameter auf 1 gesetzt ist, gibt es keine Beschränkung von der Anzahl der abgefragten Datensätze. Die Datensätze können auch mit Wildcards gefiltert werden. Eine Wildcard wird mit dem Zeichen „*“ an den Anfang und/oder an das Ende eines Suchbegriffs gestellt. Außerdem können die beiden logischen Operatoren UND und ODER jeweils mit den Zeichen „&&“ und „||“ verwendet werden. Das UND liefert die Schnittmenge der Datensätze, die alle Bedingungen gleichzeitig erfüllen. Das ODER liefert im Gegensatz die Vereinigungsmenge der Datensätze, die zumindest jeweils eine der Bedingungen erfüllen. Eine Abfrage, die z.B. alle Kunden in den PLZ-Bereichen 6xxxx, 7xxxx, 8xxxx, 9xxxx mit dem Anfangsbuchstaben L nach ihrem Name sortiert ausgibt, würde folgendermaßen aussehen: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:query soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="urn:KundenQuery"> <q_orderby xsi:type="xsd:string">NAME</q_orderby> <PLZ xsi:type="xsd:string"><![CDATA[6* || 7* || 8* || 9*]]></PLZ> <NAME xsi:type="xsd:string">L*</NAME> </params> </urn:query> </soapenv:Body> </soapenv:Envelope> Als Ergebnis werden alle entsprechenden Datensätze in XML ausgegeben: <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Kundenwsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:queryResponse> <return xsi:type="ns1:KundenArray"> <items xsi:type="ns1:Kunden"> <ID xsi:type="xsd:integer">43</ID> <NAME xsi:type="xsd:string">Lazy K Kountry Store</NAME> <NAME_ZUSATZ xsi:type="xsd:string"/> <STRASSE xsi:type="xsd:string">12 Orchestra Terrace</STRASSE> <ORT xsi:type="xsd:string"/> <PLZ xsi:type="xsd:string">99362</PLZ> <LAND xsi:type="xsd:string"/> <REGION xsi:type="xsd:string">WA</REGION> <POSTFACH xsi:type="xsd:string"/> <TEL xsi:type="xsd:string">(509) 555-7969</TEL> <MOBIL xsi:type="xsd:string"/> <FAX xsi:type="xsd:string">(509) 555-6221</FAX> <EMAIL xsi:type="xsd:string"/> <WEB xsi:type="xsd:string"/> <ORTSPLAN xsi:type="xsd:string"/> <KORRESPONDENZ xsi:type="ns1:KorrespondenzArray"/> <SEL xsi:type="xsd:integer">0</SEL> <BOO xsi:type="xsd:boolean">false</BOO> </items> <items xsi:type="ns1:Kunden"> <ID xsi:type="xsd:integer">45</ID> <NAME xsi:type="xsd:string">Let's Stop N Shop</NAME> <NAME_ZUSATZ xsi:type="xsd:string"/> <STRASSE xsi:type="xsd:string">87 Polk St.Suite 5</STRASSE> <ORT xsi:type="xsd:string"/> <PLZ xsi:type="xsd:string">94117</PLZ> <LAND xsi:type="xsd:string"/> <REGION xsi:type="xsd:string">CA</REGION> <POSTFACH xsi:type="xsd:string"/> <TEL xsi:type="xsd:string">(415) 555-5938</TEL> <MOBIL xsi:type="xsd:string"/> <FAX xsi:type="xsd:string"/> <EMAIL xsi:type="xsd:string"/> <WEB xsi:type="xsd:string"/> <ORTSPLAN xsi:type="xsd:string"/> <KORRESPONDENZ xsi:type="ns1:KorrespondenzArray"/> <SEL xsi:type="xsd:integer">0</SEL> <BOO xsi:type="xsd:boolean">false</BOO> </items> <items xsi:type="ns1:Kunden"> <ID xsi:type="xsd:integer">48</ID> <NAME xsi:type="xsd:string">Lonesome Pine Restaurant</NAME> <NAME_ZUSATZ xsi:type="xsd:string"/> <STRASSE xsi:type="xsd:string">89 Chiaroscuro Rd.</STRASSE> <ORT xsi:type="xsd:string"/> <PLZ xsi:type="xsd:string">97219</PLZ> <LAND xsi:type="xsd:string"/> <REGION xsi:type="xsd:string">OR</REGION> <POSTFACH xsi:type="xsd:string"/> <TEL xsi:type="xsd:string">(503) 555-9573</TEL> <MOBIL xsi:type="xsd:string"/> <FAX xsi:type="xsd:string">(503) 555-9646</FAX> <EMAIL xsi:type="xsd:string"/> <WEB xsi:type="xsd:string"/> <ORTSPLAN xsi:type="xsd:string"/> <KORRESPONDENZ xsi:type="ns1:KorrespondenzArray"/> <SEL xsi:type="xsd:integer">0</SEL> <BOO xsi:type="xsd:boolean">false</BOO> </items> </return> </ns1:queryResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> getByPk Diese Funktion filtert die Datensätze einer Tabelle nach ihren Primary-Keys. Im folgenden Beispiel werden die ersten drei Datensätze abgefragt: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:getByPk soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="xsd:long">1,2,3</params> </urn:getByPk> </soapenv:Body> </soapenv:Envelope> insert Diese Funktion legt einen neuen Datensatz in der Tabelle an. Das Feld ID kann dabei freigelassen werden, wenn für den Eintrag automatisch eine ID von der Datenbank generiert werden soll. Ansonsten kann auch eine eigene ID festgelegt werden. Ein Beispiel für das Anlegen eines Kunden sieht folgendermaßen aus: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:insert soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="urn:KundenArray"> <items xsi:type="urn:Kunden"> <ID xsi:type="xsd:integer"></ID> <NAME xsi:type="xsd:string">Martin Mustermann</NAME> <NAME_ZUSATZ xsi:type="xsd:string"></NAME_ZUSATZ> <STRASSE xsi:type="xsd:string">Musterstr. 1</STRASSE> <ORT xsi:type="xsd:string">Musterstadt</ORT> <PLZ xsi:type="xsd:string">123456</PLZ> <LAND xsi:type="xsd:string">Deutschland</LAND> </items> </params> </urn:insert> </soapenv:Body> </soapenv:Envelope> update Mit dieser Funktion kann ein Datensatz verändert werden. Hat sich z.B. die Straße des Kunden mit ID 52 verändert, so kann dieser Datensatz folgendermaßen aktualisiert werden: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:update soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="urn:Kunden"> <ID xsi:type="xsd:integer">52</ID> <STRASSE xsi:type="xsd:string">Bahnhofstr. 1</STRASSE> </params> </urn:update> </soapenv:Body> </soapenv:Envelope> delete Diese Funktion löscht einen einzelnen Datensatz. So kann z.B. der erste Eintrag folgendermaßen gelöscht werden: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:getByPk soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="xsd:long">1</params> </urn:getByPk> </soapenv:Body> </soapenv:Envelope> join Diese Funktion ermöglicht es, Datensätze miteinander zu verknüpfen. Um z.B. unserem ersten Kunden die Korrespondenz-Einträge mit den IDs 1,2,3 zuzuweisen, kann folgender SOAP-Request gesendet werden: <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Kundenwsdl"> <soapenv:Header/> <soapenv:Body> <urn:join soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <params xsi:type="urn:KundenJoin"> <ID xsi:type="xsd:integer">1</ID> <KORRESPONDENZ xsi:type="xsd:string">1,2,3</KORRESPONDENZ> </params> </urn:join> </soapenv:Body> </soapenv:Envelope> Installationshinweise Da der SOAP Server sich selbst aufruft um die WSDL Definition abzufragen, muss die aufzurufende DOMAIN in der /etc/hosts eingetragen werden.