统一资源定位符(即 URL)可标识 SOAP 或 HTTP Web 服务提供的文档,例如 HTML 页。SQL Anywhere 中使用的 URL 式样就是您浏览 Web 时经常使用的式样。通过数据库服务器进行浏览的用户无需知道他们的请求没有通过传统的独立 Web 服务器进行处理。
尽管使用标准格式,但 SQL Anywhere 数据库服务器解释 URL 的方式不同于标准 Web 服务器。您在启动数据库服务器时指定的选项也会影响对它们的解释。
URL 的一般语法如下:
{ http | https }://[ user:password@ ]host[ :port ][ /dbn ]/service-name[ path | ?searchpart ]
以下是一个示例 URL: http://localhost:80/demo/XMLtable
.
如果 Web 服务需要验证,则可以将用户名和口令作为 URL 的一部分直接传递,方式是用冒号将它们分隔并将它们放在主机名前面(与电子邮件地址非常相似)。
与所有标准 HTTP 请求一样,URL 的开始部分包含主机名或 IP 地址,还可以包含端口号。IP 地址(或主机名)及端口应当是服务器正在监听的 IP 地址(或主机名)及端口。IP 地址是运行 SQL Anywhere 的计算机中网卡的地址。端口号将是启动数据库服务器时使用 -xs 选项指定的端口号。如果未指定端口号,则使用该类型服务的缺省端口号。例如,服务器缺省情况下在端口 80 上监听 HTTP 请求。请参见-xs 服务器选项。
位于斜线之间的下一个标识通常是数据库的名称。此数据库必须在服务器上运行,并且必须含有 Web 服务。
如果 URL 中未出现数据库名,并且没有使用 -xs 服务器选项的 DBN 连接参数指定数据库名,则使用缺省数据库。
只有在以下情况下才能省略数据库名:数据库服务器只运行一个数据库;或者使用 -xs 选项的 DBN 连接参数指定了数据库名。
URL 的下一部分是服务名。此服务必须存在于指定的数据库中。服务名可以跨出下一个斜线字符,因为 Web 服务名可以包含斜线字符。SQL Anywhere 会将 URL 的其余部分与定义的服务进行匹配。
如果 URL 未提供服务名称,则数据库服务器将查找名为 root 的服务。如果未定义指定的服务或 root 服务,则服务器返回 [404 Not Found
] 错误。
根据目标服务类型,可以通过不同方式提供参数。HTML、XML 和 RAW 服务的参数可以通过以下任何方式传递:
使用斜线附加到 URL
作为显式 URL 参数列表提供
作为 POST 请求中的 POST 数据提供
SOAP 服务的参数必须作为标准 SOAP 请求的一部分提供。以其它方式提供的值将被忽略。
若要访问参数值,必须为参数指定名称。这些主机变量名(以冒号 (:) 为前缀)可包含在构成部分 Web 服务定义的语句中。
例如,假设您定义以下存储过程:
CREATE PROCEDURE Display (IN ident INT ) BEGIN SELECT ID, GivenName, Surname FROM Customers WHERE ID = ident; END; |
调用存储过程的语句需要客户标识号。如下所示定义服务:
CREATE SERVICE DisplayCustomer TYPE 'HTML' URL PATH ELEMENTS AUTHORIZATION OFF USER DBA AS CALL Display( :url1 ); |
它的 URL 实例为: http://localhost:80/demo/DisplayCustomer/105。
将参数 105
作为 url1
传递给服务。子句 URL PATH ELEMENTS 指明应将由斜线隔开的参数作为参数 url1
、url2
、url3
(以此类推)进行传递。依此方法最多可传递 10 个参数。
由于 Display 过程只有一个参数,因此该服务可能已定义如下:
CREATE SERVICE DisplayCustomer TYPE 'HTML' URL PATH ON AUTHORIZATION OFF USER DBA AS CALL Display( :url ); |
在本例中,会将参数 105
作为 url
传递给服务。子句 URL PATH ON 指明应将服务名后面的所有内容作为单个参数(称为 url
)传递。因此,在以下 URL 中,会将字符串 105/106 作为 url
传递(且会产生 SQL 错误,因为 Display 存储过程要求整数值)。
http://localhost:80/demo/DisplayCustomer/105/106
有关变量的详细信息,请参见处理变量。
也可使用 HTTP_VARIABLE 函数访问参数。请参见HTTP_VARIABLE 函数 [HTTP]。
另一个传递参数的方法是通过 URL searchpart 机制传递。URL searchpart 由问号 (?) 和问号后面用 "和" 符号 (&) 隔开的 name=value 对组成。searchpart 将被附加到 URL 的结尾。以下示例表明了一般格式:
http://server/path/document?name1=value1&name2=value2 |
GET 请求是以这种方式进行格式设置的。如果存在,则定义指定的变量并对其赋予相应的值。
例如,调用存储过程 ShowSalesOrderDetail 的语句既需要客户标识号也需要产品标识号:
CREATE SERVICE ShowSalesOrderDetail TYPE 'HTML' URL PATH OFF AUTHORIZATION OFF USER DBA AS CALL ShowSalesOrderDetail( :customer_id, :product_id ); |
它的 URL 实例为: http://localhost:80/demo/ShowSalesOrderDetail?customer_id=101&product_id=300。
如果将 URL PATH 设置为 ON 或 ELEMENTS,则会定义其它变量。但这两者在其它情况下通常都是相互独立的。可以通过将 URL PATH 设置为 ON 或 ELEMENTS 来允许在请求的 URL 中使用变量。以下示例说明了如何将这两者混合使用:
CREATE SERVICE ShowSalesOrderDetail2 TYPE 'HTML' URL PATH ON AUTHORIZATION OFF USER DBA AS CALL ShowSalesOrderDetail( :customer_id, :url ); |
在以下示例中,同时使用了 searchpart 和 URL 路径。为 url
指派值 300,为 customer_id
指派 101。
http://localhost:80/demo/ShowSalesOrderDetail2/300?customer_id=101
也可以使用 searchpart 来表示(仅按以下方式)。
http://localhost:80/demo/ShowSalesOrderDetail2/?customer_id=101&url=300
这样就产生一个问题,即为同一个变量同时指定两者时会出现什么情况。在以下的示例中,前面的 300 和后面的 302 被依次指派到 url
,并且最后的指派优先。
http://localhost:80/demo/ShowSalesOrderDetail2/300?customer_id=101&url=302
有关变量的详细信息,请参见处理变量。
也可使用 HTTP_VARIABLE 函数访问参数。请参见HTTP_VARIABLE 函数 [HTTP]。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |