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_endpoint 的新 DISH 服务,此服务处理进来的 SOAP 服务请求。如果使用其他用户 ID 登录,则必须对 USER DBA 子句进行更改以反映您的用户 ID。

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

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

    此语句创建名为 FtoCService 的新 SOAP 服务,此服务生成 XML 格式的字符串作为输出。当 Web 客户端向服务发送 SOAP 请求时,它调用名为 FToCConverter 的存储过程。如果使用其他用户 ID 登录,则必须对 USER DBA 子句进行更改以反映您的用户 ID。

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



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

    注意

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

    SOAP_HEADER 函数在标头名不存在时返回标头值或 NULL。FToCConverter 过程搜索名为 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 响应的示例客户端。前进至第 2 课:设置用于发送 SOAP 请求和接收 SOAP 响应的 Web 客户端

 另请参见