用Delphi编写CGI程序(三)
也 许 各 位 读 者 感 到 CGI 程 序 有 一 种 神 秘 感, 在 这 一 部 分 将 讲 述 一 些 关 于 CGI 程 序 的 基 本 编 程 过 程。 您 读 了 之 后, 就 不 会 再 有 神 秘 感 了。
3 、 CGI 规 范 的 其 他 问 题:
也 许 各 位 读 者 感 到 CGI 程 序 有 一 种 神 秘 感, 在 这 一 部 分 将 讲 述 一 些 关 于 CGI 程 序 的 基 本 编 程 过 程。 您 读 了 之 后, 就 不 会 再 有 神 秘 感 了。
首 先, 在 进 行 任 何 编 程 工 作 时, 将 一 个 大 任 务 分 成 许 多 小 任 务, 每 个 小 任 务 完 成 相 对 独 立 的 功 能。 许 多 人 不 愿 自 己 编 写 CGI 程 序, 就 是 因 为 觉 得 CGI 编 程 很 难。 其 实, 将 一 个 典 型 的 CGI 程 序 分 成 以 下 几 个 部 分, 再 一 一 解 决, 您 就 不 会 对 CGI 程 序 感 到 困 难 了:
总 体 的 说, 在 浏 览 器 中 调 用 一 个 CGI 程 序 时, 服 务 器 首 先 要 找 到 CGI 程 序, 一 般 的, CGI 程 序 都 放 在 服 务 器 指 定 的 目 录 中, 在 我 们 的 OmniHTTPD 中, 在 cgi-bin 和 cgi-win 虚 拟 目 录 指 定 的 实 际 目 录 下, 分 别 为 c:\httpd\cgi-bin 和 c:\httpd\cgi-win 目 录。 您 可 以 在 OmniHTTPD 中 修 改 实 际 目 录, 也 可 以 添 加 虚 拟 目 录, 如: 将 虚 拟 目 录 cgi-test 指 定 为 c:\my-cgi ; 如 果 您 在 c:\my-cgi 目 录 下 有 一 个 名 为 test1.cgi 的 CGI 程 序, 您 可 以 在 浏 览 器 中 通 过 地 址 http://localhost/cgi-test/test1.cgi 调 用 它。
在 正 常 情 况 下 服 务 器 找 到 了 浏 览 器 请 求 的 CGI 程 序, 就 产 生 了 此 CGI 程 序 的 一 个 进 程。 这 样, 浏 览 器 与 服 务 器 就 建 立 好 了 连 接。 一 旦 CGI 程 序 执 行 完 毕, 此 进 程 就 消 失, 连 接 也 消 失 了。 上 图 中 所 有 的 操 作 都 是 在 建 立 了 连 接 的 时 间 内 完 成 的, 因 此, 每 个 CGI 程 序 完 成 的 任 务 要 尽 可 能 小, 否 则, 会 占 用 服 务 器 的 大 量 时 间 和 资 源, 客 户 端 浏 览 器 的 等 待 时 间 也 会 很 长。
在 上 面 的 图 中 您 可 以 看 到,CGI 程 序 一 般 分 为 数 据 输 入、 数 据 处 理 和 数 据 输 出 三 个 部 分; 有 时, 要 在 数 据 处 理 部 分 同 数 据 库 进 行 交 互( CGI 程 序 的 特 长 也 在 此)。 这 三 个 部 分 中, 数 据 输 入 和 数 据 输 出 有 严 格 的 规 范, 而 数 据 处 理 就 是 您 发 挥 想 象 力 的 地 方 了。 下 面, 我 将 着 重 讲 一 讲 数 据 输 入 和 数 据 输 出 的 规 范 及 注 意 事 项:
在 以 前, 我 们 曾 列 出 了 CGI 程 序 所 用 的 几 乎 所 有 环 境 变 量。 其 中, 有 相 当 一 部 分 是 同 数 据 的 输 入 和 输 出 有 密 切 关 系 的。 下 面, 我 们 就 分 类 列 出 其 中 最 常 用 的 环 境 变 量:
与 服 务 器 相 关 的 环 境 变 量:
GATEWAY_INTERFACE
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
与 客 户 机 相 关 的 环 境 变 量:
HTTP_ACCEPT
HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE
HTTP_AUTHORIZATION
HTTP_CHARGE_TO
HTTP_FROM
HTTP_IF_MODIFIED_SINCE
HTTP_PRAGMA
HTTP_REFERER
HTTP_USER_AGENT
与 请 求 相 关 的 环 境 变 量:
AUTH_TYPE
CONTENT_FILE
CONTENT_LENGTH
CONTENT_TYPE
OUTPUT_FILE
PATH_INFO
PATH_TRANSLATED
QUERY_STRING
REMOTE_ADDR
REMOTE_USER
REQUEST_LINE
REQUEST_METHOD
SCRIPT_NAME
在 这 里 值 得 说 明 的 是 CONTENT_FILE 和 OUTPUT_FILE 。 在 Windows 3.1 和 DOS 上 没 有 很 多 语 言 可 以 通 过 标 准 输 入 输 出( STDIN 和 STDOUT ) 读 和 写, 所 以 用 这 两 个 变 量 代 替。 其 他 的 环 境 变 量 可 以 参 考 以 前 的 详 细 列 表。
以 前 讲 过, GET 方 法 通 过 URL 传 递 数 据; POST 方 法 通 过 STDIN 传 递 数 据。 无 论 是 用 什 么 方 法, 数 据 传 递 过 程 中 数 据 是 经 过 编 码 的。 不 过, 我 们 不 用 担 心 编 码 和 解 码 的 问 题, 因 为 我 们 将 用 的 开 发 语 言 可 以 自 动 完 成 此 任 务: 在 Perl 中 是 cgi-lib.pl , 在 Delphi 中 是 TWebModule 等。
头 信 息 在 CGI 编 程 中 也 是 非 常 重 要 的。 头 信 息 是 CGI 程 序 在 向 客 户 机 发 信 息 前 的 信 号。 有 三 个 主 要 的 头 信 息 类 型:
Content-type //向浏览器传递HTML
Location //向浏览器传递新的URL
Status //通常在CGI程序出错使用来检查错误
Content-type 是 浏 览 器 处 理 的 信 息 类 型, 主 要 是 MIME 的 类 型。 定 义 的 方 法 为 类 型 和 子 类 型 的 组 合。 常 用 的 MIME 类 型 有: Text 、 Multipart 、 Message 、 Application 、 Image 、 Audio 和 Video 。
例 如, CGI 程 序 要 向 浏 览 器 传 送 一 个 HTML 文 档 前, 应 先 传 送 text/html 。 用 Perl 书 写 如 下:
print "Content-type:text/html\n\n"
print "< h1> Hi everyone! < /h1>\n"
Location 使 浏 览 器 转 向 新 的 URL 。 例 如:
print "Location:http://www.chinabyte.com"
这 段 Perl 程 序 使 浏 览 器 转 向 ChinaByte 的 主 页。
Status 指 出 CGI 程 序 的 状 态, 通 常 在 CGI 程 序 出 错 使 用 来 检 查 错 误。 下 表 列 出 了 常 用 的 状 态 码 及 含 义:
代 码 结 果 描 述
200 OK 请 求 正 常 满 足
202 Accept 请 求 被 接 受, 处 理 中
301 Moved 文 档 被 移 到 新 地 点
302 Found 文 档 不 在 说 明 处, 但 在 服 务 器 别 处
400 Bad Request HTTP 请 求 的 语 法 不 对
401 Unauthorized 文 档 需 要 存 取 权
403 Forbindden 服 务 器 拒 绝 访 问 文 档
404 No Found 服 务 器 找 不 到 文 档
500 Server Error 服 务 器 发 生 严 重 错 误
502 Service Overloaded 服 务 器 忙, 无 法 处 理 请 求
这 一 讲 到 这 里 就 完 了。 各 位 有 了 这 些 CGI 的 基 础 知 识 后, 可 以 开 始 使 用 任 何 一 种 语 言 一 步 步 开 发 CGI 程 序 了。 我 再 一 次 告 诉 大 家, CGI 程 序 并 不 神 秘, 它 只 不 过 是 一 种 建 立 服 务 器 和 某 种 任 务 的 对 话。
本文地址:http://com.8s8s.com/it/it5986.htm