也許各位讀者感到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 程式並不神秘, 它只不過是一種建立伺服器和某種任務的對話。