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

 

使用提供 HTML 文档的过程

通常,编写一个可处理发送给特定服务的请求的过程是最简单的方式。这样的过程将返回一个 Web 页。或者,该过程也可接受作为 URL 的一部分进行传递的参数以对其输出进行自定义。

但以下示例要简单很多。它例示了服务可以简单到什么程度。此 Web 服务仅返回短语 "Hello world!"。

CREATE SERVICE hello 
TYPE 'RAW'
AUTHORIZATION OFF 
USER DBA
AS SELECT 'Hello world!';

使用 -xs 选项启动数据库服务器以启用对 Web 请求的处理,然后从任一 Web 浏览器请求 URL [external link] http://localhost/hello。"Hello world!" 将显示在另外的纯文本页面上。

HTML 页

上述页面在浏览器中以纯文本格式显示。这是因为缺省 HTTP Content-Type 是 text/plain。若要创建更标准的 Web 页(HTML 格式),则必须执行两个任务:

  • 将 HTTP Content-Type 标头字段设置为 text/html,以使浏览器预期 HTML。

  • 在输出中包含 HTML 标记。

可通过两种方法将标记写入到输出中。一种方法是使用 CREATE SERVICE 语句中的短语 TYPE 'HTML'。这样会指示 SQL Anywhere 数据库服务器为您添加 HTML 标记。在某些情况下(例如在返回表时),这种方法很有效。

另一种方法是使用 TYPE 'RAW' 并自己编写所有必要的标记。使用第二种方法可对输出进行最大程度的控制。请注意,指定 RAW 类型不一定表示输出不会采用 HTML 或 XML 格式。它只是告知 SQL Anywhere 可将返回值直接传递给客户端,而无需自己添加标记。

以下过程将生成一版更别致的 "Hello world"。为方便起见,主体工作在下面的过程中完成,该过程设置了 Web 页的格式。

内置过程 sa_set_http_header 用于设置 HTTP 标头类型,使浏览器能够正确解释结果。如果省略此语句,浏览器将显示所有 HTML 代码,而不是使用它们设置文档格式。

CREATE PROCEDURE hello_pretty_world ()
RESULT (html_doc XML)
BEGIN
  CALL dbo.sa_set_http_header( 'Content-Type', 'text/html' );
  SELECT HTML_DECODE(
    XMLCONCAT(
      '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">',
      XMLELEMENT('HTML',  
      XMLELEMENT('HEAD',
          XMLELEMENT('TITLE', 'Hello Pretty World')
        ),
        XMLELEMENT('BODY',
          XMLELEMENT('H1', 'Hello Pretty World!'),
          XMLELEMENT('P',
            '(If you see the tags in your browser, check that '
            || 'the Content-Type header is set to text/html.)'
          )
        )
      )
    )
  );
END

以下语句将创建一个使用此过程的服务。该语句将调用上述过程,该过程会生成 "Hello Pretty World" Web 页。

CREATE SERVICE hello_pretty_world 
TYPE 'RAW'
AUTHORIZATION OFF 
USER DBA
AS CALL hello_pretty_world();

创建该过程和服务后,便可以访问 Web 页了。请确保数据库服务器是使用正确的 -xs 选项值启动的,然后在 Web 浏览器中打开 URL [external link] http://localhost/hello_pretty_world

您将看到以简单的 HTML 页格式显示的结果,标题是 "Hello Pretty World"。您可以通过加入更多内容、使用更多标记、使用样式表或者加入在浏览器中运行的脚本来按照自己的需要详尽设计该 Web 页。在任何情况下,都要创建处理浏览器请求所必需的服务。

有关内置存储过程的详细信息,请参见按字母顺排序的系统过程列表

Root 服务

如果 URL 中不含服务名,则 SQL Anywhere 会查找名为 root 的 Web 服务。Root 页的作用与许多传统 Web 服务器中 index.html 页的作用类似。

Root 服务在创建主页时很方便,因为它们可以处理只含有 Web 站点地址的 URL 请求。在处理不存在的 URL 路径时,它们同样能够提供方便。例如,以下过程和服务会实现一个在您浏览至 URL [external link] http://localhost 时显示的简单 Web 页。它还用于处理浏览至并不存在的页面的情况。

CREATE PROCEDURE HomePage( IN url LONG VARCHAR )
RESULT (html_doc XML)
BEGIN
  CALL dbo.sa_set_http_header( 'Content-Type', 'text/html' );
  IF url IS NULL THEN
    SELECT HTML_DECODE(
      XMLCONCAT(
        '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">',
        XMLELEMENT('HTML',
          XMLELEMENT('HEAD',
            XMLELEMENT('TITLE', 'My Home Page')
          ),
          XMLELEMENT('BODY',
            XMLELEMENT('H1', 'My home on the web'),
            XMLELEMENT('P',
              'Thank you for visiting my web site!'
            )
          )
        )
      )
    )
  ELSE    
    CALL dbo.sa_set_http_header('Status','404'); 
    SELECT '<H1>Status 404 - Document ' || url || ' not found</H1>'  
  END IF
END

现在创建一个使用此过程的服务:

CREATE SERVICE root 
TYPE 'RAW'
AUTHORIZATION OFF 
SECURE OFF
URL PATH ON
USER DBA
AS CALL HomePage(:url);

只要未指定在启动数据库服务器时必须提供数据库名,便可以通过浏览至 URL [external link] http://localhost 来访问此 Web 页。请参见启动监听 Web 请求的数据库服务器。通过指定 URL PATH ON,可确保不存在的 URL 路径指向此服务。

示例

更多详尽示例包含在 samples-dir\SQLAnywhere\HTTP 目录中。