In dieser Lektion richten Sie einen neuen Datenbankserver ein und erstellen einen SOAP-Dienst für die Verarbeitung von eingehenden SOAP-Anforderungen. Der Server erwartet SOAP-Anforderungen mit einem Fahrenheit-Wert der in Celsius konvertiert werden muss.
Führen Sie zum Erstellen einer SQL Anywhere-Datenbank den folgenden Befehl aus:
dbinit ftc |
Starten Sie den Netzwerk-Datenbankserver mit dem folgenden Befehl:
dbsrv12 -xs http(port=8082) -n ftc ftc.db |
Dieser Befehl gibt an, dass der HTTP-Webserver an Port 8082 auf Anforderungen warten soll. Verwenden Sie eine andere Portnummer, wenn die Verwendung von 8082 in Ihrem Netzwerk nicht zulässig ist.
Stellen Sie in Interactive SQL mit dem folgenden Befehl eine Verbindung zum Datenbankserver her:
dbisql -c "UID=DBA;PWD=sql;SERVER=ftc" |
Erstellen Sie eines neuen DISH-Dienstes zum Annehmen der eingehenden Anforderungen.
Führen Sie die folgende SQL-Anweisung in Interactive SQL aus:
CREATE SERVICE soap_endpoint TYPE 'DISH' AUTHORIZATION OFF SECURE OFF USER DBA; |
Diese Anweisung erstellt einen neuen DISH-Dienst mit dem Namen soap_endpoint, der die eintreffenden SOAP-Dienstanforderungen abwickelt.
Erstellen Sie einen neuen SOAP-Dienst für die Konvertierung von Fahrenheit zu Celsius.
Führen Sie die folgende SQL-Anweisung in Interactive SQL aus:
CREATE SERVICE FtoCService TYPE 'SOAP' FORMAT 'XML' AUTHORIZATION OFF USER DBA AS CALL FToCConvertor( :temperature ); |
Diese Anwendung erstellt einen neuen SOAP-Dienst mit dem Namen FtoCService, der als Ausgabe in XML formatierte Zeichenfolgen generiert. Es ruft eine gespeicherte Prozedur mit dem Namen FToCConvertor auf, wenn ein Webclient eine SOAP-Anforderung an den Dienst sendet. Sie erstellen die FToCConvertor-Prozedur im nächsten Schritt.
Erstellen Sie die FToCConvertor-Prozedur für das Bearbeiten von eingehenden SOAP-Anforderungen. Diese Prozedur führt die erforderlichen Berechnungen zur Konvertierung eines vom Client gelieferten Fahrenheit-Werts in einen Celsius-Wert.
Führen Sie hierzu die folgende SQL-Anweisung in Interactive SQL aus:
CREATE PROCEDURE FToCConvertor( temperature FLOAT ) BEGIN DECLARE hd_key LONG VARCHAR; DECLARE hd_entry LONG VARCHAR; DECLARE alias LONG VARCHAR; DECLARE first_name LONG VARCHAR; DECLARE last_name LONG VARCHAR; DECLARE xpath LONG VARCHAR; DECLARE authinfo LONG VARCHAR; DECLARE namespace LONG VARCHAR; DECLARE mustUnderstand LONG VARCHAR; header_loop: LOOP SET hd_key = NEXT_SOAP_HEADER( hd_key ); IF hd_key IS NULL THEN -- no more header entries LEAVE header_loop; END IF; IF hd_key = 'Authentication' THEN SET hd_entry = SOAP_HEADER( hd_key ); SET xpath = '/*:' || hd_key || '/*:userName'; SET namespace = SOAP_HEADER( hd_key, 1, '@namespace' ); SET mustUnderstand = SOAP_HEADER( hd_key, 1, 'mustUnderstand' ); BEGIN -- parse the XML returned in the SOAP header DECLARE crsr CURSOR FOR SELECT * FROM OPENXML( hd_entry, xpath ) WITH ( alias LONG VARCHAR '@*:alias', first_name LONG VARCHAR '*:first/text()', last_name LONG VARCHAR '*:last/text()' ); OPEN crsr; FETCH crsr INTO alias, first_name, last_name; CLOSE crsr; END; -- build a response header -- based on the pieces from the request header SET authinfo = XMLELEMENT( 'Authentication', XMLATTRIBUTES( namespace as xmlns, alias, mustUnderstand ), XMLELEMENT( 'first', first_name ), XMLELEMENT( 'last', last_name ) ); CALL SA_SET_SOAP_HEADER( 'authinfo', authinfo ); END IF; END LOOP header_loop; SELECT ROUND((temperature - 32.0) * 5.0 / 9.0, 5) AS answer; END; |
Die Funktion NEXT_SOAP_HEADER wird in einer LOOP-Struktur verwendet, um eine Iteration durch alle Headernamen in einer SOAP-Anforderung durchzuführen. Die Schleife wird beendet, wenn die Funktion NEXT_SOAP_HEADER den Wert NULL zurückgibt.
Diese Funktion führt die Iteration durch die Header nicht notwendigerweise in derselben Reihenfolge durch, in der sie in der SOAP-Anforderung aufgeführt sind.
Die Funktion SOAP_HEADER gibt den Headerwert zurück oder NULL, wenn der Headername nicht vorhanden ist. Die FToCConvertor-Prozedur sucht nach einem Header mit dem Namen Authentication und extrahiert die Headerstruktur, einschließlich der Attribute @namespace und mustUnderstand. Das Header-Attribut @namespace ist ein spezielles SQL Anywhere-Attribut, das zum Zugriff auf den Namespace (xmlns) des angegebenen Headereintrags verwendet wird.
Im Folgenden finden Sie ein XML-Zeichenfolge, die eine mögliche Authentication-Headerstruktur repräsentiert, wobei das Attribut @namespace den Wert "SecretAgent" und mustUnderstand den Wert 1 hat:
<Authentication xmlns="SecretAgent" mustUnderstand="1"> <userName alias="99"> <first>Susan</first> <last>Hilton</last> </userName> </Authentication> |
Die OPENXML-Systemprozedur in der SELECT-Anweisung führt eine syntaktische Analyse der XML-Header-Zeichenfolge "/*:Authentication/*:userName" durch, um den Attributwert alias und den Inhalt der Tags first und last zu extrahieren. Die Ergebnismenge wird mit einem Cursor verarbeitet, um die drei Spaltenwerte abzurufen.
Sie haben nun alle gewünschten Informationen, die an den Webdienst übergeben wurden. Sie haben die Temperatur in Fahrenheit und einige zusätzliche Attribute, die dem Webdienst in einem SOAP-Header übergeben wurden. Sie können den Namen und den Alias suchen, die übergeben wurden, um festzustellen, ob die Person für die Verwendung des Webdienstes autorisiert ist. Diese Übung wird jedoch nicht in dem Beispiel gezeigt.
Die SET-Anweisung wird zum Erstellen einer SOAP-Antwort im XML-Format verwendet, die an den Client gesendet wird. Im Folgenden finden Sie eine XML-Zeichenfolge, die eine mögliche SOAP-Antwort repräsentiert. Sie basiert auf dem weiter oben aufgeführten Beispiel mit der Authentication-Headerstruktur.
<Authentication xmlns="SecretAgent" alias="99" mustUnderstand="1"> <first>Susan</first> <last>Hilton</last> </Authentication> |
Die Systemprozedur SA_SET_SOAP_HEADER wird zum Einrichten des SOAP-Antwort-Headers verwendet, der an den Client gesendet wird.
Die endgültige SELECT-Anweisung wird zum Konvertieren des gelieferten Fahrenheit-Werts in einen Celsius-Wert verwendet. Diese Informationen werden dann wieder an den Client weitergegeben.
Sie haben nun einen laufenden SQL Anywhere-Webserver, der einen Dienst für die Konvertierung der Temperaturen von Fahrenheit in Celsius bereitstellt. Dieser Dienst verarbeitet einen SOAP-Header vom Client und sendet eine SOAP-Antwort zurück an den Client. Im nächsten Abschnitt entwickeln Sie ein Beispiel für einen Client, der SOAP-Anforderungen an den Webserver senden und SOAP-Antworten vom Webserver empfangen kann.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |