Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » HTTP-Webdienste » Beispiele für HTTP-Webdienste » Praktische Einführung: Verwenden von SQL Anywhere für den Zugriff auf einen SOAP/DISH-Dienst

 

Lektion 1: Einrichten eines Webservers für den Empfang von SOAP-Anforderungen und das Senden von SOAP-Antworten

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, die einen Fahrenheit-Temperaturwert liefern, der in Grad Celsius konvertiert wird.

Voraussetzungen

In dieser Lektion wird davon ausgegangen, dass Sie die Rollen und Privilegien haben, die im Abschnitt "Privilegien" am Anfang dieser praktischen Einführung aufgeführt sind: Praktische Einführung: Verwenden von SQL Anywhere für den Zugriff auf einen SOAP/DISH-Dienst.

 Aufgabe
  1. Erstellen Sie eine SQL Anywhere-Datenbank, die verwendet wird, um Webdienstdefinitionen zu speichern.

    dbinit -dba DBA,sql ftc
  2. Starten Sie einen Datenbankserver mit dieser Datenbank. Dieser Server fungiert als Webserver.

    dbsrv16 -xs http(port=8082) -n ftc ftc.db

    Der HTTP-Webserver ist so eingestellt, dass er Port 8082 auf Anforderungen abhört. Verwenden Sie eine andere Portnummer, wenn 8082 in Ihrem Netzwerk nicht zulässig ist.

  3. Stellen Sie über Interactive SQL eine Verbindung mit dem Datenbankserver her.

    dbisql -c "UID=DBA;PWD=sql;SERVER=ftc"
  4. Erstellen Sie einen neuen DISH-Dienst zum Annehmen von eingehenden Anforderungen.

    CREATE SERVICE soap_endpoint 
        TYPE 'DISH'
        AUTHORIZATION OFF
        SECURE OFF
        USER DBA;

    Diese Anweisung erstellt einen neuen DISH-Dienst namens soap_endpoint, der eingehende SOAP-Dienstanforderungen verarbeitet. Wenn Sie sich mit einer anderen Benutzer-ID angemeldet haben, muss die USER DBA-Klausel gemäß Ihrer Benutzer-ID geändert werden.

  5. Erstellen Sie einen neuen SOAP-Dienst für die Konvertierung von Fahrenheit in Celsius.

    CREATE SERVICE FtoCService
        TYPE 'SOAP'
        FORMAT 'XML'
        AUTHORIZATION OFF
        USER DBA
        AS CALL FToCConverter( :fahrenheit );

    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 FToCConverter auf, wenn ein Webclient eine SOAP-Anforderung an den Dienst sendet. Wenn Sie sich mit einer anderen Benutzer-ID angemeldet haben, muss die USER DBA-Klausel gemäß Ihrer Benutzer-ID geändert werden.

  6. Erstellen Sie die FToCConverter-Prozedur zum Bearbeiten von eingehenden SOAP-Anforderungen. Diese Prozedur führt die erforderlichen Berechnungen zur Konvertierung eines vom Client gelieferten Fahrenheit-Temperaturwerts in den entsprechenden Celsius-Temperaturwert aus.



    CREATE OR REPLACE PROCEDURE FToCConverter( 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.

    Hinweis

    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 FToCConverter-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.

Ergebnisse

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.

Nächste Schritte

In der nächsten Lektion entwickeln Sie ein Beispiel für einen Client, der SOAP-Anforderungen an den Webserver senden und SOAP-Antworten vom Webserver empfangen kann. Gehen Sie weiter zu Lektion 2: Einrichten eines Webclients zum Senden von SOAP-Anforderungen und Empfangen von SOAP-Antworten.

 Siehe auch