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

 

处理变量

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:

[external link] http://localhost:80/demo/ShowDetail?product_id=300&customer_id=101

有关参数传递的详细信息,请参见了解如何解释 URLWeb 服务函数