HTTP 请求中的变量来自两个来源之一。第一个来源是 URL,URL 中可能包含查询字符串,查询字符串中会包含各种 name=value 对。HTTP GET 请求是以这种方式进行格式设置的。以下是包含查询字符串的 URL 示例。
http://localhost/gallery?picture=sunset.jpg |
第二个来源是通过 URL 路径提供。将 URL PATH 设置为 ON 或 ELEMENTS 都会使服务名后的路径部分被解释为变量值。此选项让 URL 看起来像是在请求特定目录中的某文件(与基于文件的传统 Web 站点上的情况一样),而不是在请求存储在数据库中的内容。以下是一个示例。
http://localhost/gallery/sunset.jpg |
此 URL 看起来像是在请求目录 gallery 中的文件 sunset.jpg。实际上,gallery 服务将此字符串作为参数接收(或许使用它从数据库表中检索图片)。
HTTP 请求中传递的参数取决于 URL PATH 的设置。
OFF 不允许在服务名后添加路径参数。
ON 服务名后的所有路径元素都赋予给变量 URL。
ELEMENTS 按照斜线字符将 URL 路径的其余部分分割成数量最多为 10 个的一组元素。这些值被赋予给变量 URL1、URL2、URL3、……、URL10。如果提供的值少于 10 个,则将其余变量设置为 NULL。指定 10 个以上变量会导致出错。
除了定义位置不同外,各变量间没有任何差异。所有 HTTP 变量的访问和使用方式都相同。例如,访问变量值(如 url1)的方式与访问显示为查询一部分的参数(如 ?picture=sunset.jpg)的方式相同。
访问变量的方式主要有两种。第一种方式是在服务声明语句中引用变量。例如,以下语句将多个变量的值传递给 ShowTable 存储过程:
CREATE SERVICE ShowTable TYPE 'RAW' AUTHORIZATION ON AS CALL ShowTable( :user_name, :table_name, :limit, :start ); |
另一种方式是使用处理请求的存储过程中的内置函数 NEXT_HTTP_VARIABLE 和 HTTP_VARIABLE。如果不知道定义了哪些变量,可以使用 NEXT_HTTP_VARIABLE 查找。HTTP_VARIABLE 函数返回变量值。
NEXT_HTTP_VARIABLE 函数允许您遍历已定义变量的名称。首次调用该函数时,将传入 NULL 值。这将返回一个变量的名称。如果连续调用它,并且每次都传入上一个变量名,则将返回下一个变量名。在将最后一个变量的名称传递给此函数时,它将返回 NULL。
以这种方式遍历变量名可确保每个变量名都刚好返回一次。但值的返回顺序不一定与它们在请求中出现的顺序相同。此外,如果再次遍历这些变量名,它们可能会以另一个不同的顺序返回。
若要获取每个变量的值,请使用 HTTP_VARIABLE 函数。第一个参数是变量的名称。其它参数是可选参数。如果为同一变量提供了多个值,则函数在仅被提供一个参数时会只返回第一个值。提供整数作为第二个参数使您可以检索其它值。
第三个参数允许您从包含多个部分的请求中检索变量标头字段值。提供标头字段的名称以检索其值。例如,以下 SQL 语句将检索三个变量值,然后检索 image 变量的标头字段值。
SET v_id = HTTP_VARIABLE( 'ID' ); SET v_title = HTTP_VARIABLE( 'Title' ); SET v_descr = HTTP_VARIABLE( 'descr' ); |
SET v_name = HTTP_VARIABLE( 'image', NULL, 'Content-Disposition' ); SET v_type = HTTP_VARIABLE( 'image', NULL, 'Content-Type' ); SET v_image = HTTP_VARIABLE( 'image', NULL, '@BINARY' ); |
以下是使用 HTTP_VARIABLE 函数检索变量相关值的一个示例。它是上文中所述的 ShowSalesOrderDetail 服务的修改后版本。
CREATE PROCEDURE ShowDetail() BEGIN DECLARE v_customer_id LONG VARCHAR; DECLARE v_product_id LONG VARCHAR; SET v_customer_id = HTTP_VARIABLE( 'customer_id' ); SET v_product_id = HTTP_VARIABLE( 'product_id' ); CALL ShowSalesOrderDetail( v_customer_id, v_product_id ); END; |
以下是调用存储过程的服务:
CREATE SERVICE ShowDetail TYPE 'HTML' URL PATH OFF AUTHORIZATION OFF USER DBA AS CALL ShowDetail(); |
若要测试该服务,请打开 Web 浏览器并输入以下 URL:
http://localhost:80/demo/ShowDetail?product_id=300&customer_id=101
有关参数传递的详细信息,请参见了解如何解释 URL和Web 服务函数。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |