CGI技術及其開發 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
主題:CGI技術及其開發(一)返回
日期: 1991/3/30 作者:戚文敏
作為Internet上最主要的資訊管理和組織手段,WWW由一系列相應的技術及應用構
成,其組成技術包括HTTP、HTML、URL以及CGI等。WWW伺服器本身提供一些基本功
能,以完成用戶端的請求和自身的管理。但不同的用戶有不同的功能要求,其中許
多功能是WWW伺服器本身 不能提供的(比如線上查詢等),它必須提供一種擴展手
段,以允許用戶編寫擴展應用程式來擴展伺服器的功能。CGI(CommonGatewayInterface,
即通用閘道介面)就是這樣的一種標準擴展技術。下面就CGI的基本技術及其開發
進行討論。 一、CGI技術
1.1CGI的提出
CGI是外部擴展應用程式與WWW伺服器交互的一個標準介面。按照CGI標準編寫的外
部擴展應用程式可以處理用戶端(一般是WWW流覽器)輸入的協同工作資料,完成
用戶端與伺服器的交互操作。這在實際應用中非常有用,如可以編寫CGI外部擴展
程式來訪問外部資料庫,用戶端用戶可以通過它和WWW伺服器來進行資料查詢。CGI
一般分兩種:標準CGI和緩衝CGI。所有的WWW伺服器均應支援標準CGI,按標準CGI
編寫的程式與具體的WWW伺服器無關。而按緩衝CGI編寫的程式與WWW伺服器有關。
1.2CGI的工作原理
1.標準CGI
用戶端、伺服器、CGI介面與外部程式間的關係可用圖1-1表示:如上圖所示,服
務器是用戶端(如流覽器)與擴展程式之間的通道。當用戶端的用戶完成了一定
輸入工作(比如填充完HTML文檔中的FORM表)之後向伺服器發出HTTP請求(稱為CGI
請求),伺服器守護進程接收到該請求後,就創建一個子進程(稱為CGI進程)。
該CGI子進程將CGI請求的有關資料設置成環境變數,在外部CGI程式與伺服器間建
立兩條資料通道(標準I/O),然後啟動URL指定的CGI程式,並與該子進程保持同
步,以監測CGI程式的執行狀態。子進程通過標準輸出流將處理結果傳遞給伺服器
守護進程,守護進程再將處理結果作為應答消息回送到用戶端。外部CGI程式通過
環境變數、命令行參數、標準輸入輸出與WWW伺服器進行通訊,傳遞有關參數和處
理結果。*環境變數:當伺服器守護進程創建子進程運行CGI程式時,設置相應的
環境變數和命令行參數,以傳遞用戶端和伺服器的有關資訊給該子進程。*命令行
參數:命令行參數僅在有HTML文檔中有ISINDEX查詢的情況下使用。*標準輸入輸
出:當HTTP請求模式採用POST方式時,CGI程式通過標準輸入流和有關環境變數來
獲取用戶端傳輸資料;如採用GET方式時,CGI程式直接通過環境變數獲取用戶端傳
輸數據。當CGI程式要返回處理結果(一般為HTML文檔)給用戶端時,它通過標準
輸出流將該結果資料傳遞給伺服器守護進程。
2.緩衝CGI
標準CGI使用Stdin/Stdout來進行資料通訊,這是由其最初開發環境(Unix操作
系統)所決定的。但是許多Windows環境下的編程工具(如VB和Delphi等)是不支
持這種I/O方式的,這時就不能用它們來開發基於標準CGI的應用程式。於是有些
伺服器提出了緩衝CGI的概念。緩衝CGI亦稱為WinCGI。此時CGI擴展程式與伺服器
間通過緩衝CGI而不是標準CGI進行通訊,而緩衝CGI與伺服器間的通訊還是通過標
准CGI介面。後者由WWW伺服器的內置緩衝處理程式實現。這幾部分的關係可用圖
1-2表示:緩衝CGI的工作原理與標準CGI相似,不同的是當伺服器守護進程接收
到用戶端的CGI請求時,所建立的CGI子進程將CGI請求的有關資料設置成環境變數
外,還將它們保存在輸入緩衝區中;通過緩衝處理程式在外部CGI程式與伺服器間
建立兩條資料通道(輸入/輸出緩衝區)。CGI子進程通過輸出緩衝區將處理結果
傳遞給伺服器守護進程。此處外部CGI程式通過環境變數和輸入/輸出緩衝區與WWW
伺服器進行通訊,傳遞有關參數和處理結果。此處環境變數的意義同上,不過這
些環境變數及其相應值保存在輸入緩衝區中。此外,輸入緩衝區中還存放用戶端
的傳輸資料(如採用POST模式的話)。輸出緩衝區用來存放擴展程式的處理結果。
3.標準CGI與緩衝CGI的區別
對CGI擴展程式而言,最主要差別在於資料的I/O不同:對緩衝CGI,伺服器與CGI
擴展程式間的資料交換是通過緩衝區;而標準CGI是通過標準I/O。使用緩衝CGI可
選擇更多的開發工具,可以開發Windows95和WindowsNT下的GUI擴展程式;而使用
標準CGI所選用的開發工具必須支援標準I/O。只有少數幾種WWW伺服器支援緩衝CGI,
因此基於它的擴展程式相容性不如標準CGI好。
1.3CGI與其他WWW技術的關係
CGI作為WWW伺服器的標準擴展技術,由上面CGI的基本原理可知,它和許多其他的
WWW技術密切相關,如HTTP、HTML、MIME和URL等,下面主要就它與前兩種技術的關
系進行研究。
1.CGI與HTTP協議
CGI通過HTTP協定在用戶端和服務端進行通訊:*用戶端用戶代理向伺服器發送的
請求是HTTP請求消息。該消息中含有處理用戶輸入的CGI擴展程式的URL值。*CGI
擴展程式在處理結束後,返回給用戶端的應答是HTTP應答消息。因此CGI程式的輸
出資料必須符合HTTP應答消息的語法格式,這在基於CGI標準的開發中非常重要。
2.CGI與HTML語言
CGI擴展程式的輸出資料(HTTP應答消息)一般有兩種:符合MIME類型的文檔(最
普遍的是HTML文檔,表示為text/html);指向其他文檔的URL鏈結。這兩種方式
都與HTML語言有關,資料的組織須符合HTML語法格式。
1.4CGI開發的幾個問題
基於WWW的人機交互一般有兩種情況:本地交互和通過網路傳輸的交互。前者是指
用戶端用戶的輸入資料在用戶端本地進行處理,然後將處理結果返回給用戶,常
見的開發工具有JavaScript(Netscape開發)和VBScript(Microsoft開發);後
者是指用戶端用戶輸入的資料通過網路傳輸到WWW伺服器,伺服器處理結束後將處
理結果返回給用戶端用戶,常見的開發技術是WWW伺服器擴展技術(如CGI,API等)。
此處主要討論基於標準CGI技術的通過網路進行資料傳輸的交互實現。對這種人機
交互的實現,主要有三個環節需要解決:如何獲取用戶端傳輸的資料,如何提取有
效資料並處理這些資料,如何向用戶端返回應答。下面分別結合有關技術,談談這
三方面問題的解決。
1.用戶端傳輸資料的獲取
由第三章CGI的原理可知,當服務端守護進程接收到用戶端用戶代理(如流覽器)
提交的CGI請求時,所創建的CGI子進程會設置與CGI請求內容有關的環境變數,並
建立伺服器與外部CGI程式之間通訊的通道(即標準I/O)。CGI程式可以通過環境
變數,標準I/O或命令行參數獲取用戶端用戶輸入的資料。資料的獲取與請求所采
用的HTTP方法(Method)和用戶所使用的請求方式有關。用戶通過CGI請求資料一
般有三種方式:HTMLFORM表,ISINDEX,可點擊圖片(ISMAP或Imagemaps)。後兩
種方式是通過命令行參數傳遞用戶的輸入資料;在C語言中(下面的舉例亦然),
CGI程式可以用argc和argv〔int〕獲得這些參數值。而前一種方式則取決於HTTP請
求方法;但不管採用何種方法,都將用到環境變數來傳遞有關請求內容。
●獲取環境變數
環境變數的類別很多,包含用戶端和服務端的詳細資訊。在一般CGI程式開發中,
下述幾個環境變數在資料傳遞中起著重要作用。
*GATEWAY-INTERFACE
CGI程式所使用的CGI標準介面的版本號。如使用的CGI1.1版,該變數表示為
"CGI/1.1"
*REQUEST-METHOD
HTTP請求方法。根據該變數值可判斷CGI請求所採用的請求方法,以決定是通過Stdin
還是通過環境變數QUERY-STRING獲取用戶端傳輸資料。
*QUERY-STRING
QUERY-STRING是CGI程式URL中〃?〃之後的資料。當使用ISINDEX查詢或FORM表使
用GET方法時,用戶端傳輸資料可以通過讀取該變數而獲得。
*CONTENT-LENGTH
CONTENT-LENGTH表示用戶端傳輸資料的位元組數。
*CONTENT-TYPE
CONTENT-TYPE表示用戶端傳輸資料的資料編碼類型。
利用-environ(int)函數可以獲得所有的環境變數及其值;
利用getenv(constchar*)函數可以獲得指定環境變數的相應值。
●HTTP請求方法
用戶端用戶代理提交的CGI請求是HTTP請求,其中包括HTTP請求方法。HTTP協議定義
的請求方法中常用的主要有GET和POST。
用戶端FORM表的METHOD屬性用來設置請求方法,其缺省值為GET。如果在FORM中使用
GET方法,CGI程式通過環境變數QUERY-STRING獲取用戶端傳輸資料。如果在FORM中
使用POST方法,CGI程式通過通過CONTENT-LENGTH獲取用戶端傳輸資料的位元組數,
通過Stdin讀取用戶端傳輸資料。
2.有效資料的提取和處理
通過上述方式獲取的用戶端傳輸資料的一般格式為:
name〔1〕=value〔1〕&name〔2〕=value〔2〕&...name〔i〕
=value〔i〕...name〔n〕=value〔n〕
(1Ι=iΙ=n)
其中name〔i〕表示變數名,它是在FORM表中某輸入域的名字;value〔i〕表示變數
值,它是用戶在FORM表中某輸入域中輸入的值。用戶端傳輸資料的每對〃Name=Value〃
串由′&′字元分隔,其資料編碼類型可以從環境變數CONTENT-TYPE獲取。CGI/1.1
版僅支援"application/x-www-form-urlenQcoded"編碼方式。這種編碼方式和
URL的編碼方式一樣,遵循兩個規則:資料中的空格(ASCII碼值32)編碼成′+′號;
保留字元編碼成〃%XX〃形式,〃XX〃是該字元ASCII值的十六進位表示,比如〃$〃
的編碼為〃%24〃,〃?〃的編碼為〃%3F〃。因此,要獲取用戶端用戶的輸入資料,
必須對上述獲取的資料進行分離和解碼等處理。利用函數strtok()、strchr()等
可以實現資料分離處理,而資料的解碼則需要對整個資料串進行掃描,將資料串中的
〃%XX〃復原為對應的ASCII碼。在提取到有效資料後,還可能進行許多其他的處理,
如資料庫查詢等。這種處理與普通編程相同。
3.向用戶端返回應答
CGI程式處理結束後,通過標準輸出流將應答資訊傳遞給伺服器,再由伺服器返回給發
出請求的用戶端。其輸出的應答資訊是HTTP應答消息,它一般由兩部分組成:應答頭
和應答數據。常見的應答頭包括三種頭域:Content-Type(資料編碼類型,用MIME類
型表示),Location(特定文檔的URL,這種情況不直接向用戶端輸出內容而輸出該URL)
和Status(處理結果的狀態碼和狀態描述)。HTTP應答頭由幾行格式相同的文本構成,
每行的基本格式為:〃頭功能變數名稱:該域內容〃。應答頭和應答體之間用一空行加LF(或
CR/LF)分隔。應答體為CGI擴展程式的輸出資料,其資料類型應該與Content-Type
值相一致。CGI程式的輸出可以用printf()、puts()等標準I/O函數來實現。
4.CGI程式的開發及其一般流程
在開發CGI程式過程中,可根據實際情況(伺服器提供的介面、實際需求和程式師經驗
等)選擇編程語言,如C/C++,Perl,TCL,AnyUnixshell,VB,AppleScript。如
果選用C/C++等語言,必須編譯成可執行檔;如果選用Perl等解釋語言,伺服器
必須安裝相應的解釋器。 二、CGI與其他擴展技術的比較
除CGI標準擴展技術外,常見的擴展技術還有API(ApplicationProgrammingInterface)
和SSI(ServerSideIncludes),這兩種技術都與具體的WWW伺服器有關。下麵先對這兩
種技術簡要說明,然後再對這三種技術作比較。SSI技術:當伺服器守護進程接收到客
戶端請求時,其子進程掃描用戶端所請求的文檔,以獲取資料插入標誌,再插入相關動
態資料,然後返回給用戶端。這種技術簡單,但效率不高。API技術:不同的WWW伺服器
提供的API可能不同,比如O′ReillyWebsite提供的是WSAPI;PurveyorWebserver和Microsoft
IIS提供的是ISAPI。利用這些API編寫程式的流程和最後生成的檔類型也不一樣;比
如用ISAPI,編寫程式時必須依照它的特定框架,最後建立的檔可以是EXE檔和DLL
文件。下表(圖3-3)列出了CGI、SSI和API三種技術在主要性能方面的比較:SSI CGI API
實現的靈活性 差 好 好 可實現的功能 差 強大 強大對程式師的要求 低 一般 較高
開發與測試時間 短 一般 較長 花費 低 一般 較高操作的風險性 低 低 較大移植性
較好 較好 差 CPU的負載 高 高 較低CGI和API都需要編程實現,利用它們可訪問更
多的數據源;而SSI不需編程。利用API開發的擴展軟體,其運行速度比CGI快,功能也
較CGI強;但其操作有一定的風險,出現錯誤時可能使系統崩潰(CGI程式不會),並
且它非常依賴於具體的伺服器而移植性太差,開發週期較長。CGI在操作的風險性、軟
件移植性、軟體發展難度等方面較API有優勢;其缺點在於CPU負載較高,特別是同時
發生的CGI請求很多時,將影響伺服器的綜合性能。綜合比較而言,CGI比其他兩種技
術更優秀,在實際應用中也最為普遍。
**********************************************************************
主題:CGI技術及其開發(二)返回
日期: 1991/3/30 作者:戚文敏
在 上 一 講 中, 我 們 設 置 了 用 於 開 發 CGI 程 序 的 系 統。 今 天, 我 們
進 入: 第 二 部 分、 CGI 程 序 設 計 的 概 念 …… 第 二 部 分、 CGI 程 序 設 計 的 概 念
1.0 、 CGI 程 序 的 功 能: 首 先, 什 麼 是 公 共 網 關 接 口( CGI ) 呢? CGI 是 一 個 用 於 定
義 WEB 服 務 器 與 外 部 程 序 之 間 通 信 方 式 的 標 准, 使 得 外 部 程 序
能 生 成 HTML 、 圖 象 或 者 其 他 內 容, 而 服 務 器 處 理 的 方 式 與 那 些
非 外 部 程 序 生 成 的 HTML 、 圖 象 或 者 其 他 內 容 的 處 理 方 式 是 相
同 的。 因 此, CGI 程 序 不 僅 使 你 能 生 成 靜 態 內 容, 而 且 能 生 成 動
態 內 容。 使 用 CGI 的 原 因 在 於 它 是 一 個 定 義 良 好 並 被 廣 泛 支 持
的 標 准。 雖 然, Java 、 ActiveX 等 可 以 完 成 CGI 程 序 的 功 能, 但 並
不 是 所 有 瀏 覽 器 都 支 持 它 們。 相 反, 所 有 瀏 覽 器 都 支 持 CGI ,
如: Lynx 、 IE 、 Netscape 等。 然 而, 和 其 他 技 術 一 樣, CGI 也 有 它 的 局 限 性。 本 節 我 就 講
述 CGI 程 序 的 功 能、 優 點 與 不 足。 1.1 、 CGI 功 能 有 許 多 任 務, CGI 是 最 佳 的 是 唯 一 的 選 擇, 這 些 任 務 可 分
為 三 類: 初 級 任 務、 中 級 任 務 和 高 級 任 務。 初 級 任 務 是 一 些 不
用 怎 麼 編 程 的 任 務, 如: 文 本 型 計 數 器
生 成 簡 單 的 HTML 的 程 序
少 於 50 行 用 Perl 語 言、 Shell 腳 本、 C 語 言 或 C 語 言 編 寫 的 程 序 這 樣 的 任 務 用 CGI 來 寫 至 少 有 三 點 好 處: 第 一、 CGI 運 行 最
快, 而 Java 等 開 銷 太 大; 第 二、 CGI 標 准 於 當 前 瀏 覽 器 最 兼 容,
這 一 點 在 前 面 已 經 提 到; 第 三、 CGI 資 源 豐 富, 您 在 Internet 上 可
以 找 到 成 千 上 萬 的 CGI 代 碼。
中 級 任 務 是 包 括 圖 象 映 象 和 其 他 一 些 稍 複 雜 的 程 序 設 計
任 務。 在 中 級 任 務 中, 用 CGI 和 Java 來 編 寫 程 序 的 難 易 程 度 差 別
不 大。 此 類 任 務 包 括: 圖 象 映 象
生 成 整 頁 的 HTML 的 CGI 腳 本
動 畫
很 有 特 點 的 是, 對 于 高 級 任 務, 用 CGI 比 用 Java 編 程 要 簡 單
得 多。 此 類 任 務 有:
後 端 數 據 庫 操 作
搜 索 引 擎
多 重 動 態 頁 面
其 中, 後 端 數 據 庫 操 作( 存 取 數 據 庫 的 應 用 程 序) 體 現 了
CGI 的 優 越 性。 CGI 有 一 定 的 曆 史, 其 中 很 多 有 用 的 功 能 都 在
CGI 的 庫 中 由 別 人 做 好 了; 同 時, 許 多 大 公 司 提 供 了 用 CGI 承 蠆
僮 髕 涫 菘 獾 姆 椒?6 遙? ava 是 一 種 程 序 設 計 語 言, 而 CGI 是
網 關 程 序 的 功 能 規 範。 如 果 Java 有 較 大 改 變, 您 得 重 寫 整 個 程
序; 而 CGI 有 較 大 變 化 的, 您 只 要 升 級 CGI 庫 程 序 即 可。
然 而, CGI 在 有 些 方 面 還 是 有 局 限 性 的。 1.2 、 CGI 的 局 限 性 在 圖 象 映 象 和 動 畫 方 面, CGI 程 序 不 如 Java 程 序 開 發 方 便。
現 在 Java 越 來 越 流 行, CGI 程 序 則 越 來 越 適 合 編 寫 簡 短 雜 亂 的
程 序 和 數 據 庫 應 用 程 序。 1.3 、 CGI 程 序 功 能 CGI 程 序 的 最 大 特 點 是 可 以 用 任 何 一 種 語 言 編 制, 可 運 行
在 任 何 一 種 平 台 上, 只 要 它 符 合 CGI 的 規 範 即 可。 下 表 是 一 個
比 較: 任 務
CGI HTML
HTML 處 理 表 單
Yes
No 創 建 WEB 頁 面 上 非 靜 態 內 容
Yes
No 處 理 圖 象 映 象 文 件
Yes
Yes 在 WEB 頁 面 和 文 檔 中 搜 索
Yes
No 創 建 表 單
Yes
Yes 創 建 平 台 無 關 的 文 檔
Yes
Yes 創 建 聊 天 室 等 交 互 應 用 程 序
Yes
No 頁 面 動 態 生 成
Yes
No 按 用 戶 需 要 進 行 頁 面 文 檔 裁 剪
Yes
No 下 面, 我 們 用 一 系 列" Hello World " 程 序 結 束 本 講:
Perl :
Require "cgi-lib.pl"; print &PrintHeader;
print "\n";
print "Hello World\n";
print &PrintEnv;
exit; 此 文 件 存 儲 在 C:\HTTPD\CGI-BIN 目 錄 下, 文 件 名 為 2_1.pl 。 在
瀏 覽 器 中 用 地 址 http://localhost/cgi-bin/2_1.pl 調 用。 注 意, 此 時
OmniHTTPD 應 在 運 行。 如 果 一 切 正 常, 您 可 以 在 瀏 覽 器 中 看 見"
Hello World " 和 環 境 變 量。 C : #include
#include "html-lib.h"
#include "cgi-lib.h" int main()
{
html_header();
html_begin("Test CGI");
h1("CGI Program");
printf(" ------------------------------------------------------------------------------
--
\n");
h2("CGI Environment Variables");
print_cgi_env();
html_end();
return 0; }
編 譯 後 將 可 執 行 文 件 複 制 到 C:\HTTPD\CGI-BIN 下, 改 名 為
2_1.cgi , 用 地 址 http://localhost/cgi-bin/2_1.cgi 調 用。 ***************************************************************************
哈哈&兵燹
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |