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_endpoint 的新 DISH 服务,此服务处理进来的 SOAP 服务请求。

  5. 创建新的 SOAP 服务来处理华氏温度到摄氏温度的转换。

    在 Interactive SQL 中执行以下 SQL 语句:

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

    此语句创建名为 FtoCService 的新 SOAP 服务,此服务生成 XML 格式的字符串作为输出。当 Web 客户端向服务发送 SOAP 请求时,它调用名为 FToCConvertor 的存储过程。在下一个步骤中将创建 FToCConvertor 过程。

  6. 创建 FToCConvertor 过程以处理到来的 SOAP 请求。此过程执行必要的运算来将客户端提供的华氏温度值转换为摄氏温度值。

    在 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 函数用于 LOOP 结构中再次遍历 SOAP 请求中的所有标头名,并在 NEXT_SOAP_HEADER 函数返回 NULL 时退出循环。

    注意

    此函数不一定按照标头在 SOAP 请求中出现的顺序遍历它们。

    SOAP_HEADER 函数在标头名不存在时返回标头值或 NULL。FToCConvertor 过程搜索名为 Authentication 的标头,并抽取标头结构,包括 @namespacemustUnderstand 属性。@namespace 标头属性为特殊 SQL Anywhere 属性,用于访问给定标头条目的命名空间 (xmlns)。

    以下为可能的 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 标签的内容。使用游标读取三个列值来处理结果集。

    此时,您获取了传递给 Web 服务的所有相关信息。您获取了华氏温度和在 SOAP 标头中传递给 Web 服务的一些其它属性。你可以查找提供的名称和别名,查看此人是否有权使用 Web 服务。但是,示例中没有此练习。

    SET 语句用于构建 XML 格式的 SOAP 响应以发送给客户端。以下是可能的 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 响应发送回客户端。在下一节中,将开发一个能向 Web 服务器发送 SOAP 请求并从 Web 服务器接收 SOAP 响应的示例客户端。

 另请参见