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

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

 

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

このレッスンでは、新しいデータベースサーバーを設定し、着信 SOAP 要求を処理する SOAP サービスを作成します。サーバーでは、摂氏に変換する必要のある華氏の値を指定する SOAP 要求を予期しています。

 ♦ SOAP 要求を受信し SOAP 応答を送信するデータベースサーバーの設定
  1. 次のコマンドを実行して、SQL Anywhere データベースを作成します。

    dbinit ftc
  2. 次のコマンドを使用してネットワークデータベースサーバーを起動します。

    dbsrv12 -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 サービスを作成します。

    Interactive SQL で次の SQL 文を実行します。

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

    この文は、着信 SOAP サービス要求を処理する soap_endpoint という新しい DISH サービスを作成します。

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

    Interactive SQL で次の SQL 文を実行します。

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

    この文は、XML 形式の文字列を出力として生成する FtoCService という新しい SOAP サービスを作成します。Web クライアントがサービスに SOAP 要求を送信すると、FToCConvertor というストアドプロシージャーが呼び出されます。FToCConvertor プロシージャーは、次の手順で作成します。

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

    Interactive SQL で次の SQL 文を実行します。



    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;

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

    注意

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

    SOAP_HEADER 関数は、ヘッダー値またはヘッダー名が存在しない場合は NULL を返します。FToCConvertor プロシージャーは、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 応答を受信する、クライアントの例を開発します。

 参照