在上一講中, 我們介紹了CGI 程式的功能。 今天, 我們進入: 第二部分、 CGI 程式設計的概念。本講的內容是深入了解CGI 程序的基礎。
本系列講座是用Delphi 寫CGI 程序, 對於本次的內容Delphi 已經封裝在它的類別中, 您也許認為本講沒有必要。 但我認為CGI 的優點之一是可用的開發語言多( 下面將提到這個問題), 而本講的內容可用於任何程式設計語言中( 包括Delphi )。 所以, 要發揮CGI 的優勢, 本講的內容還是必要的; 再說, 本講的內容是深入了解CGI 程序的基礎。
2 、 CGI 規範:
通常, WEB 伺服器是一台功能強大的計算機, 但不可能利用所有處理能力。 CGI 的產生使得人們可以用WEB 伺服器的處理能力為遠端客戶提供有趣的、 動態的內容。 CGI 規範應用於WEB 伺服器及運行在WEB 上的應用程式。 它不是HTTP 協定的一部分, 但大多數WEB 伺服器都支援這個規範, 如NCSA httpd 、 CERN httpd 、 Apache httpd 、 IIS 及我們使用的OmniHTTPD 。
2.1 、 CGI 概覽
CGI 定義WEB 伺服器、 瀏覽器和應用程式之間的相互操作中共同遵守的規則集。 例如透過WEB 瀏覽器查詢遠端資料庫系統:
2.2 、 語言:
CGI 程式可以使用WEB 伺服器上可以執行的任何語言來編寫。 您應該選用最熟悉和最適合目前工作的語言。 如: Perl 語言適合字串和檔案處理, C 對大型的、 複雜的程式更合適, Visual Basic 和Delphi 則適合資料庫的處理, 等等。 以下是常用的CGI 程式語言:
C
C++
Perl
Tcl
Python
Shell Scripts
Visual Basic
Delphi
Applescript
2.3 、 CGI 方法:
呼叫CGI 的途徑稱為CGI 方法。 主要有三種CGI 方法:
2.3.1 、 GET 方法:
GET 方法是瀏覽器向WEB 伺服器提出請求的方法。 使用此方法時, CGI 程式會從環境變數QUERY_STRING 取得資料。 CGI 程式為了得到輸入的參數, 必須分析這個環境變數。 當傳輸的資料很長時, 應使用POST 方法。
2.3.2 、 POST 方法:
使用POST 方法時, CGI 程式從stdin ( 標準輸入) 得到輸入資料。 由於輸入資料的最後沒有EOF ( 檔案結束標誌End Of File ), CGI 程式為了正確讀取輸入數據,必須使用環境變數CONTENT_LENGTH 值。 用這種方法的最大優點在於可以傳輸大量數據, 而GET 方法由於受URL 長度的限制( 一般不超過1024 位元組), 無法傳輸大量數據。 這時, POST 方法是唯一的選擇。
2.3.3 、 HEAD 方法:
HEAD 方法基本上同於GET 方法, 只是它是從WEB 伺服器傳送資料到瀏覽器。 而且, 傳輸的只是HTTP 的頭資訊。
2.4 、 介面規格:
以下將介紹WEB 伺服器與CGI 程式通訊的四種主要方法: 環境變數、 命令列、 標準輸入和標準輸出。 ( 根據CGI Version 1.1 給出)
2.4.1 、 環境變數:
AUTH_TYPE : 如果伺服器支援確認且腳本受到保護, 給予確認的類型。
CONTENT_LENGTH : 給出以位元組為單位的用POST 方法傳輸的資料長度。 用GET 方法時變數為空。
CONTENT_TYPE : 給出用POST 方法時傳輸資料的MINE 類型。 當使用GET 方法時變數為空。 如: application/x-www-form-urlencoded 。
GETWAY_INTERFACE : 給出CGI 規範名稱和版本號, 如: CGI/1.1 。
PATH_INFO : 給出了URL 中CGI 程式名之後的附加路徑資訊。
PATH_TRANSLATED : CGI 程式的實體路徑, 通常是WEB 根目錄、 腳本名稱和附加路徑資訊。
QUERY_STRING : URL 中" ? " 字元後面的資訊。 使用GET 方法時此環境變數給出輸入資料。
REMOTE_ADDR : 提出要求的遠端電腦的IP 。
REMOTE_HOST : 提出要求的遠端電腦的名字。
REMOTE_IDENT : 給出RFC 931 中定義的使用者名稱。
註: RFC 931 是Internet 的權威文檔, 描述了確認TCP 連線中識別使用者的方法。 文件在: http://sunsite.auc.dk/RFC/rfc/rfc931.html 。
REMOTE_USER : 給予提出要求的客戶端的授權使用者名稱。
REQUEST_METHOD : 提出請求的方法, 可以是GET 、 HEAD 和POST 。
SCRIPT_NAME : 要執行CGI 程式的虛擬路徑, 如: /cgi-bin/query.cgi 。
SERVER_NAME : 執行WEB 伺服器軟體的電腦網域或IP 位址, 如: www.chinabyte.com 。
SERVER_PORT : WEB 伺服器的連接埠號碼, 預設值為80 。
SERVER_PROTOCOL : WEB 伺服器使用的協定名稱和版本號, 如: HTTPD/1.0 。
SERVER_SOFTWARE : 執行CGI 程式的WEB 伺服器名稱。 格式為" 伺服器名稱/ 版本號碼" , 如: NCSA/1.5b5 。
HTTP_ACCEPT : 用戶端發送的"Accpect : 標題行" , 對應於客戶端能處理的MIME 類型, 格式為" 類型/ 子類型, 類型/ 子類型等" , 如: */* , image/gif , image/ jpeg 。
HTTP_REFERER : 是Referer : 標題行的目錄, 包含了CGI 請求時的表單( Form ) 的URL , 如: http://www.chinabyte.com/register.form 。
HTTP_USER_AGENT : 提出請求的客戶端瀏覽器名, 如: Mozilla/1.2N ( Windows;I;32bit )。
以上的這些環境變數您可以用上一講的示範程式看到。
2.4.2 、 命令列:
CGI 命令列只在用ISINDEX 查詢時才用到。 ISINDEX 查詢是包含在< ISINDEX> 和< BASE HREP=".."> 之間的特殊查詢。 命令列可以帶多個參數。
2.4.3 、 標準輸入:
使用POST 方法時, CGI 程式從stdin 得到傳輸資料。 前面講過, 必須使用CONTENT_TYPE 和CONTENT_LENGTH 環境變數值。 其中要注意的是, 資料中的URL 被編碼了, 如空格用加號代替、 ~ 由%7E 代替等。
2.4.4 、 標準輸出:
CGI 程式透過標準輸出將資料送到瀏覽器, 或是WEB 伺服器可解釋的命令。 CGI 程式可以透過WEB 伺服器同瀏覽器對話, 它們的程式名稱必須以"nph-" 開頭, 代表未經分析的頭資訊。 CGI 程式負責傳回給瀏覽器的HTTP 頭資訊的正確性。
在不使用nph- 程式時, 伺服器會尋找CGI 可能傳回的三種特殊的頭資訊:
Content-type : MIME 類型的頭訊息, 如: 輸入HTML 時, 常用"Content-type:text/html " 。
Location : 告知伺服器你正指向別的文件。 伺服器或重新導向客戶, 或傳送文件內容, 這取決於URL 是完整路徑還是相對路徑。
Status : 伺服器發送給客戶端的狀態列。 格式為: nnnXXXXX , nnn 是三位數編碼, 而XXXXX 是相對應的描述文。