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 服务

 

第 2 课:设置用于发送 SOAP 请求和接收 SOAP 响应的 Web 客户端

在本课中,您将设置用于发送 SOAP 请求和接收 SOAP 响应的 Web 客户端。本课假设您已经按照上一课设置了 Web 服务器。有关本课所述的设置数据库服务器以处理 Web 客户端 SOAP 请求的详细信息,请参见第 1 课:设置用于接收 SOAP 请求和发送 SOAP 响应的 Web 服务器.

注意

本课中包含对 localhost 的引用。如果 Web 客户端与 Web 服务器运行在不同的计算机上,则使用第 1 课中 Web 服务器的 IP 地址而不是 localhost

 ♦ 设置用于发送 SOAP 请求和接收 SOAP 响应的客户端
  1. 运行以下命令创建 SQL Anywhere 数据库:

    dbinit ftc_client
  2. 使用以下命令启动个人数据库客户端:

    dbsrv12 ftc_client.db
  3. 使用以下命令在 Interactive SQL 中连接数据库:

    dbisql -c "UID=DBA;PWD=sql;SERVER=ftc_client"
  4. 创建新的存储过程以向 DISH 服务发送 SOAP 请求。

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

    CREATE PROCEDURE FtoC( temperature FLOAT,
        INOUT inoutheader LONG VARCHAR,
        IN inheader LONG VARCHAR )
      URL 'http://localhost:8082/soap_endpoint'
      SET 'SOAP(OP=FtoCService)'
      TYPE 'SOAP:DOC'
      SOAPHEADER '!inoutheader!inheader';

    URL 子句中的 http://localhost:8082/soap_endpoint 字符串表示 Web 服务器在 localhost 上运行且监听 8082 端口。需要的 DISH Web 服务名为 soap_endpoint,它作为 SOAP 端点。

    SET 子句指定要调用的 SOAP 操作名称或 FtoCService 服务。

    创建 Web 服务请求时使用的缺省格式是 'SOAP:RPC'。本例中选择了 'SOAP:DOC' 格式,此格式与 'SOAP:RPC' 相似但允许更多数据类型。SOAP 请求始终以 XML 文档发送。SOAP 请求的发送机制是 'HTTP:POST'。

    SQL Anywhere 客户端过程中的替换变量(inoutheaderinheader)必须是字母数字字符。如果将 Web 服务客户端声明为函数,所有参数仅处于 [IN] 模式(无法由调用函数赋值)。因此,OPENXML 或其它字符串函数将必须用来提取 SOAP 响应标头信息。

  5. 创建构建两个特殊 SOAP 请求标头条目的包装过程,将它们传递给 FtoC 过程,并处理服务器响应。

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



    CREATE PROCEDURE FahrenheitToCelsius( temperature FLOAT )
    BEGIN
      DECLARE io_header LONG VARCHAR;
      DECLARE in_header LONG VARCHAR;
      DECLARE result LONG VARCHAR;
      DECLARE err INTEGER;
      DECLARE crsr CURSOR FOR
        CALL FtoC( temperature, io_header, in_header );
      SET io_header =
        '<Authentication xmlns="SecretAgent" ' ||
        'mustUnderstand="1">' ||
        '<userName alias="99">' ||
        '<first>Susan</first><last>Hilton</last>' ||
        '</userName>' ||
        '</Authentication>';
      SET in_header =
        '<Session xmlns="SomeSession">' ||
        '123456789' ||
        '</Session>';
    
      MESSAGE 'send, soapheader=' || io_header || in_header;
      OPEN crsr;
      FETCH crsr INTO result, err;
      CLOSE crsr;
      MESSAGE 'receive, soapheader=' || io_header;
      SELECT temperature, Celsius
          FROM OPENXML(result, '//tns:answer', 1, result)
          WITH ("Celsius" FLOAT 'text()');
    END;

    第一个 SET 语句创建 SOAP 标头条目的 XML 表示,以向 Web 服务器通知用户证书:

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

    第二个 SET 语句创建 SOAP 标头条目的 XML 表示,以跟踪客户端会话 ID:

    <Session xmlns="SomeSession">123456789</Session>
  6. OPEN 语句导致调用 FtoC 过程,此过程向 WEB 服务器发送 SOAP 请求并处理来自 Web 服务器的响应。响应包括在 inoutheader 中返回的标头。

在下一节中,将向 Web 服务器发送 SOAP 请求并且检查 SOAP 响应。

 另请参见