也 許 各 位 讀 者 感 到 CGI 程 序 有 一 種 神 秘 感, 在 這 一 部 分 將 講 述 一 些 關 於 CGI 程 序 的 基 本 編 程 過 程。 您 讀 了 之 後, 就 不 會 再 有 神 秘 感 了。
3 、 CGI 規 范 的 其 他 問 題:
也 許 各 位 讀 者 感 到 CGI 程 序 有 一 種 神 秘 感, 在 這 一 部 分 將 講 述 一 些 關 於 CGI 程 序 的 基 本 編 程 過 程。 您 讀 了 之 後, 就 不 會 再 有 神 秘 感 了。
首 先, 在 進 行 任 何 編 程 工 作 時, 將 一 個 大 任 務 分 成 許 多 小 任 務, 每 個 小 任 務 完 成 相 對 獨 立 的 功 能。 許 多 人 不 願 自 己 編 寫 CGI 程 序, 就 是 因 為 覺 得 CGI 編 程 很 難。 其 實, 將 一 個 典 型 的 CGI 程 序 分 成 以 下 幾 個 部 分, 再 一 一 解 決, 您 就 不 會 對 CGI 程 序 感 到 困 難 了:
總 體 的 說, 在 浏 覽 器 中 調 用 一 個 CGI 程 序 時, 服 務 器 首 先 要 找 到 CGI 程 序, 一 般 的, CGI 程 序 都 放 在 服 務 器 指 定 的 目 錄 中, 在 我 們 的 OmniHTTPD 中, 在 cgi-bin 和 cgi-win 虛 擬 目 錄 指 定 的 實 際 目 錄 下, 分 別 為 c:httpdcgi-bin 和 c:httpdcgi-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 "
print "< h1> Hi everyone! < /h1> "
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 程 序 並 不 神 秘, 它 只 不 過 是 一 種 建 立 服 務 器 和 某 種 任 務 的 對 話。