CGI技術及其開發

來源:互聯網
上載者:User
作為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-urlencoded”編碼方式。這種編碼方式和
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等解釋語言,伺服器
必須安裝相應的解譯器。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.