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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere Web 服务

 

创建 Web 服务客户端函数和过程

SQL Anywhere 数据库可提供和使用 Web 服务。这些 Web 服务可以是通过 Internet 提供的标准 Web 服务,也可以由 SQL Anywhere 数据库提供(只要 Web 服务与客户端过程或函数不在同一数据库中即可)。

SQL Anywhere 可充当 HTTP 和 SOAP 两种 Web 服务客户端。此功能通过存储函数和存储过程提供。

使用以下 SQL 语句创建和操作客户端函数和过程:

例如,用于创建 Web 服务客户端函数的 CREATE FUNCTION 和 CREATE PROCEDURE 语句的语法如下所示:

CREATE FUNCTION [ owner.]procedure-name ( [ parameter, ... ] )
RETURNS data-type
URL url-string
[ proc-attributes ]
CREATE PROCEDURE [ owner.]procedure-name ( [ parameter, ... ] )
URL url-string
[ proc-attributes ]

此语法的关键在于 URL 子句,该子句用于提供想要过程访问的 Web 服务的 URL。URL 子句的基本语法如下:

url-string :
'{ HTTP | HTTPS | HTTPS_FIPS }://[ user:password@ ]hostname[ :port ][ /path ]'

可选的用户和口令信息允许您访问要求验证的 Web 服务。主机名可以是提供 Web 服务的计算机的名称或 IP 地址。

仅当服务器正在监听缺省端口号以外的端口号时,才需要端口号。HTTP 服务的缺省端口号为 80,HTTPS 服务的缺省端口号为 443。

路径用于标识服务器上的资源或 Web 服务。

请求可发送到任何 Web 服务,无论是另一个 SQL Anywhere 数据库提供的 Web 服务还是通过 Internet 提供的 Web 服务。如果 Web 服务由同一数据库服务器提供,它不得位于客户端函数所在的数据库中。尝试访问同一数据库中的 Web 服务将导致错误 [403 禁止]。

由于感叹号用于参数替代,因此出现在过程定义中任何位置的字符串中的感叹号都必须转义。请参见! 字符转义

常见子句

可以用来提供关于过程调用的更多详细信息的其它子句如下所示:

proc-attributes :
[ TYPE { 'HTTP[ :{ GET | POST[:MIME-type] | PUT[:MIME-type] | DELETE | HEAD } ]' |
                                   'SOAP[:{ RPC | DOC } ]' } ]
[ NAMESPACE namespace-string ]
[ CERTIFICATE certificate-string ]
[ CLIENTPORT clientport-string ]
[ PROXY proxy-string ]
[ SET protocol-option-string]

TYPE 子句非常重要,因为它告知 SQL Anywhere 如何设置对 Web 服务提供商的请求的格式。可使用标准 SOAP 类型 RPC 和 DOC。可使用标准 HTTP 方法 GET 和 POST,分别指定为 HTTP:GET 和 HTTP:POST。指定 HTTP 则表示 HTTP:POST。

如果选择类型 SOAP,SQL Anywhere 会自动将请求的格式设置为 SOAP 请求所需标准格式的 XML 文档。由于 SOAP 请求始终为 XML 文档,因此如果选择了类型 SOAP,则始终会隐式使用 HTTP POST 请求将 SOAP 请求文档发送到服务器。指定 SOAP 隐含 SOAP:RPC。

Web 服务客户端函数和过程的名称

在生成外发 SOAP 请求时,将过程名用作 SOAP 操作名。此外,任何参数的名称也会出现在 SOAP 请求封装的标记名称中。由于 SOAP 服务器期望看到这些名称,因此正确地指定这些名称就称为定义 SOAP 存储过程的重要部分。除了应用于 SQL Anywhere 中过程名和函数名的一般规则外,这一事实也对 SOAP 过程和函数的名称进行了限制。

以下语句将创建一个名为 MyOperation 的 SOAP 存储过程:

CREATE PROCEDURE MyOperation ( a INTEGER, b CHAR(128) )
URL 'HTTP://localhost'
TYPE 'SOAP:DOC';

当调用此过程时(例如由下面的语句调用),会生成一个 SOAP 请求:

CALL MyOperation( 123, 'abc' );

该过程名将出现在请求主体的标记 [<m:MyOperation>] 中。该过程的两个参数 a 和 b 分别成为 [<m:a>] 和 [<m:b>]。

<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:m="http://localhost">
  <SOAP-ENV:Body>
    <m:MyOperation>
      <m:a>123</m:a>
      <m:b>abc</m:b>
    </m:MyOperation>
  </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
命名空间 URI

所有 SOAP 请求都需要一个方法命名空间 URI。服务器端的 SOAP 处理器使用此 URI 来了解请求的消息主体中各种实体的名称。

创建 SOAP:DOC 或 SOAP:RPC 类型的 SOAP 函数或过程时,可能需要先指定一个命名空间 URI,然后调用才能成功。可从 WSDL 描述文档或服务的其它可用文档获得所需的命名空间值。NAMESPACE 子句仅适用于 SOAP 函数和过程。缺省命名空间值为过程的 URI,直到(但不包括)可选的路径组成部分,并排除任何用户和口令值。

HTTPS 请求

要发布安全 HTTPS 请求,客户端必须有权访问服务器证书或用于为服务器证书签名的证书。此证书将告知 SQL Anywhere 如何加密请求。被定向到不安全服务器的请求可能会被重定向到安全服务器时,也需要证书值。

有两种方式可提供证书信息。可以将证书放置在文件中并提供文件名,或者将整个证书作为字符串值提供。您不能同时使用这两种方式。

证书属性作为字符串值提供时,字符串的构造是由分号分隔的各个 key=value 对:

certificate-string :
{ file=filename | certificate=string } ; company=company ; unit=company-unit ; name= common-name

可以使用以下键:

缩写 说明
file 证书的文件名。
certificate cert 证书本身,采用 Base64 编码。
company co 证书中指定的公司。
unit 证书中指定的公司单位。
name 证书中指定的公用名。

例如,以下语句所创建的过程会向与客户端位于同一计算机上的 Web 服务发出安全请求:

CREATE PROCEDURE test()
URL 'HTTPS://localhost/myservice'
CERTIFICATE 'file=C:\srv_cert.id;co=iAnywhere;
             unit=SA;name=JohnSmith';

由于没有提供 TYPE 子句,因此假定请求为 SOAP:RPC 类型。服务器的公共证书位于文件 C:\srv_cert.id 中。

客户端端口

通过防火墙访问 Web 服务时,有时需要告知 SQL Anywhere 在打开与服务器的连接时要使用哪些端口。通常,端口号是动态获取的,并且您应依赖该缺省行为,除非防火墙限制对特定范围端口的访问。

ClientPort 选项指定客户端应用程序通过 TCP/IP 进行通信所用的端口号。您可以指定单个端口号(或各端口号的组合),以及端口号的范围(如下例所示):

CREATE PROCEDURE test ()
URL 'HTTPS://localhost/myservice'
CLIENTPORT '5040,5050-5060,5070';

最好指定一系列端口号或端口号的范围。如果指定单个端口号,则一次只能维护一个连接。实际上,即使是在关闭这个连接之后,也会有一个长达几分钟的超时期,在此期间无法建立与同一远程服务器和端口的任何新连接。如果指定端口号的列表和/或范围,应用程序会一直尝试这些端口号,直到找到一个可成功捆绑到的端口号。

此特性与 ClientPort 网络协议选项类似。请参见ClientPort 协议选项 [CPORT]

使用代理

有些 Web 服务请求可能需要通过代理服务器发出。如果是这样,则必须使用 PROXY 子句提供代理服务器的 URL。

该值的格式与 URL 子句的相同,但忽略了所有用户、口令或路径值:

proxy-string :
'{ HTTP | HTTPS }://[ user:password@ ]hostname[ :port ][ /path ]'

如果指定了代理服务器,SQL Anywhere 将设置请求的格式,并使用提供的代理 URL 将其发送到代理服务器。代理服务器会将请求转发到最终目标,获取响应,然后将响应转发回 SQL Anywhere。

记录 Web 服务客户端过程

来自 Web 服务客户端的信息(包括 HTTP 请求和传输数据)会记录到 Web 服务客户端日志文件。您可以通过启动数据库服务器以及 -zoc 服务器选项来记录到该文件,或者通过使用 sa_server_option 系统过程设置 WebClientLogging 服务器属性来记录到该文件。请参见-zoc 服务器选项sa_server_option 系统过程


修改 HTTP 标头