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 » SQL Anywhere サーバ プログラミング » HTTP Web サービス » HTTP Web サービスの例 » チュートリアル:SQL Anywhere を使用した SOAP/DISH サービスへのアクセス

 

レッスン 1:SOAP 要求を受信し SOAP 応答を送信する Web サーバの設定

このレッスンでは、新しいデータベースサーバを設定し、着信 SOAP 要求を処理する SOAP サービスを作成します。サーバは対応する摂氏の値に変換される華氏の値を提供する SOAP 要求を予測します。

前提条件

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:SQL Anywhere を使用した SOAP/DISH サービスへのアクセス

 ♦ タスク
  1. Web サービス定義を含めるために使用する SQL Anywhere データベースを作成します。

    dbinit -dba DBA,sql ftc
  2. このデータベースを使用して、データベースサーバを起動します。このサーバは Web サーバとして動作します。

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

    HTTP Web サーバは、ポート 8082 で要求を受信するように設定されます。ネットワークで 8082 が許可されない場合は、異なるポート番号を使用します。

  3. Interactive SQL を使用して、データベースサーバに接続します。

    dbisql -c "UID=DBA;PWD=sql;SERVER=ftc"
  4. 着信要求を受け入れる新しい DISH サービスを作成します。

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

    この文は、着信 SOAP サービス要求を処理する soap_endpoint という新しい DISH サービスを作成します。別のユーザ ID でログインする場合、そのユーザ ID を反映するように USER DBA を変更する必要があります。

  5. 華氏から摂氏への変換を処理する新しい SOAP サービスを作成します。

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

    この文は、XML 形式の文字列を出力として生成する FtoCService という新しい SOAP サービスを作成します。Web クライアントがサービスに SOAP 要求を送信すると、FToCConverter というストアドプロシージャが呼び出されます。別のユーザ ID でログインする場合、そのユーザ ID を反映するように USER DBA を変更する必要があります。

  6. 着信 SOAP 要求を処理する FToCConverter プロシージャを作成します。このプロシージャは、クライアントが指定した華氏の値を対応する摂氏の値に変換するための必要な計算を実行します。



    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;

    NEXT_SOAP_HEADER 関数は、SOAP 要求に含まれるすべてのヘッダ名を繰り返すために LOOP 構造で使用され、NEXT_SOAP_HEADER 関数から NULL が返されるとループが終了します。

    注意

    この関数は、必ずしも SOAP 要求に表示される順序でヘッダを繰り返すとはかぎりません。

    SOAP_HEADER 関数は、ヘッダ値またはヘッダ名が存在しない場合は NULL を返します。FToCConverter プロシージャは、Authentication というヘッダ名を検索し、@namespace 属性と mustUnderstand 属性を含めてヘッダ構造を抽出します。@namespace ヘッダ属性は、特定のヘッダエントリの名前空間 (xmlns) にアクセスするときに使用する特殊な SQL Anywhere 属性です。

    次に、可能な Authentication ヘッダ構造の XML 文字列表現を示します。@namespace 属性の値は "SecretAgent"、mustUnderstand の値は 1 です。

    <Authentication xmlns="SecretAgent" mustUnderstand="1">
        <userName alias="99">
            <first>Susan</first>
            <last>Hilton</last>
        </userName>
    </Authentication>

    SELECT 文の OPENXML システムプロシージャでは、XPath 文字列 "/*:Authentication/*:userName" を使用して XML ヘッダを解析し、alias 属性値と、first および last タグの内容を抽出します。カーソルを使用して結果セットを処理し、3 つのカラム値をフェッチします。

    この時点で、Web サービスに渡された関連性のある情報すべてが手中にあります。華氏表現された温度が取得され、Web サービスに渡されたいくつかの追加属性が SOAP ヘッダから取得されています。たとえば、取得した名前と別名 (alias) を照会して、該当人物が Web サービスの使用を許可されているかどうかを確認できます。ただし、この演習でその例は取り上げていません。

    SET 文は、クライアントに送信する SOAP 応答を XML 形式で構築するために使用されます。次に、可能な SOAP 応答の XML 文字列表現を示します。これは、上記の Authentication ヘッダ構造の例に基づいています。

    <Authentication xmlns="SecretAgent" alias="99" mustUnderstand="1">
      <first>Susan</first>
      <last>Hilton</last>
    </Authentication>

    SA_SET_SOAP_HEADER システムプロシージャは、クライアントに送信される SOAP 応答ヘッダを設定するために使用されます。

    最後の SELECT 文は、指定された華氏の値を摂氏の値に変換するために使用されます。この情報は、クライアントに戻されます。

結果

この時点で、華氏から摂氏への温度変換を行うサービスを提供する SQL Anywhere Web サーバが実行されます。このサービスは、クライアントからの SOAP ヘッダを処理して SOAP 応答をクライアントに送り返します。

次の手順

次のレッスンでは、SOAP 要求を Web サーバに送信し、Web サーバから SOAP 応答を受信する、クライアントの例を開発します。レッスン 2:SOAP 要求を送信し SOAP 応答を受信する Web クライアントの設定に進みます。

 参照