Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
可以使用存储函数或过程进行 Web 服务客户端调用。如果从函数进行调用,则返回类型必须是字符数据类型,如 CHAR、VARCHAR 或 LONG VARCHAR。返回值是 HTTP 响应的主体。不包含任何标头信息。关于请求的附加信息(包括 HTTP 状态信息)由过程返回。这样,在需要访问附加信息时最好使用过程。
来自 SOAP 函数的响应是一个包含 SOAP 响应的 XML 文档。
SOAP 响应是结构化的 XML 文档,因此 SQL Anywhere 在缺省情况下会尝试利用此信息,并构造一个更实用的结果集。返回的响应文档中的每个顶级标记都将被抽取并用作列名。每个此类标记下的子树的内容将用作该列的行值。
例如,假设 SOAP 响应如下所示,SQL Anywhere 将构造出所显示的数据集:
<SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <ElizaResponse xmlns:SOAPSDK4="SoapInterop"> <Eliza>Hi, I'm Eliza. Nice to meet you.</Eliza> <ElizaResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
在本示例中,响应文档使用 <SOAP-ENV:Body> 标记中出现的 <ElizaResponse> 标记分隔。
结果集的列数与顶级标记数量相同。因为 SOAP 响应中只有一个顶级标记,所以此结果集只有一列。这单个顶级标记 Eliza 将成为列名。
使用 Open XML 过程也可以访问 XML 结果集中的信息(包括 SOAP 响应)。
以下示例使用 OPENXML 过程来抽取 SOAP 响应的各部分。此示例使用 Web 服务将 SYSWEBSERVICE 表的内容公开为 SOAP 服务:
CREATE SERVICE get_webservices TYPE 'SOAP' AUTHORIZATION OFF USER DBA AS SELECT * FROM SYSWEBSERVICE;
以下 Web 客户端函数(必须在另一个 SQL Anywhere 数据库中创建)发出对此 Web 服务的调用。该函数的返回值是整个 SOAP 响应文档。响应采用 .NET DataSet 数据集格式,因为 DNET 是缺省的 SOAP 服务格式。
CREATE FUNCTION get_webservices() RETURNS LONG VARCHAR URL 'HTTP://localhost/get_webservices' TYPE 'SOAP:DOC';
以下语句演示了如何使用 OPENXML 过程抽取结果集的两列。service_name 和 secure_required 列分别指明哪些 SOAP 服务是安全的以及何处需要 HTTPS。
SELECT * FROM openxml( get_webservices(), '//row' ) WITH ("Name" CHAR(128) 'service_name', "Secure?" CHAR(1) 'secure_required' );
此语句通过选择 row 节点的子节点生效。WITH 子句基于相关的两个元素构造结果集。假定只存在 get_webservices 服务,此函数将返回以下结果集:
其它类型的过程在一个两列式结果集中返回关于响应的所有信息。此结果集包含响应状态、标头信息和主体。第一列名为 Attribute,第二列名为 Value。两列的数据类型都是 LONG VARCHAR。
结果集为每个响应标头字段都提供一个数据行,并且分别为 HTTP 状态行(Status 属性)和响应主体(Body 属性)提供了一个数据行。
以下示例代表一个典型响应:
SOAP 数据类型SOAP 结构化数据类型