CGI技術原理


一、CGI技術

1.1 CGI的提出

  CGI是外部擴展應用程序與WWW服務器交互的一個標准接口。按照CGI標准編寫的外部擴展應用程序可以處理客戶端(一般是WWW瀏覽器)輸入的協同工作數據,完成客戶端與服務器的交互操作。這在實際應用中非常有用,如可以編寫CGI外部擴展程序來訪問外部數據庫,客戶端用戶可以通過它和WWW服務器來進行數據查詢。CGI一般分兩種:標准CGI和緩沖CGI。所有的WWW服務器均應支持標准CGI,按標准CGI編寫的程序與具體的WWW服務器無關。而按緩沖CGI編寫的程序與WWW服務器有關。

1.2 CGI的工作原理

  1.標准CGI

  客戶端、服務器、CGI接口與外部程序間的關系可用圖1-1表示(編排者:圖略):如上圖所示,服務器是客戶端(如瀏覽器)與擴展程序之間的通道。當客戶端的用戶完成了一定輸入工作(比如填充完HTML文檔中的FORM表)之后向服務器發出HTTP請求(稱為CGI請求),服務器守護進程接收到該請求后,就創建一個子進程(稱為CGI進程)。該CGI子進程將CGI請求的有關數據設置成環境變量,在外部CGI程序與服務器間建立兩條數據通道(標准I/O),然后啟動URL指定的CGI程序,並與該子進程保持同步,以監測CGI程序的執行狀態。子進程通過標准輸出流將處理結果傳遞給服務器守護進程,守護進程再將處理結果作為應答消息回送到客戶端。外部CGI程序通過環境變量、命令行參數、標准輸入輸出與WWW服務器進行通訊,傳遞有關參數和處理結果。
*環境變量:當服務器守護進程創建子進程運行CGI程序時,設置相應的環境變量和命令行參數,以傳遞客戶端和服務器的有關信息給該子進程。
*命令行參數:命令行參數僅在有HTML文檔中有SINDEX查詢的情況下使用。
*標准輸入輸出:當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.3 CGI與其他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.4 CGI開發的幾個問題

  基於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=value...name[n]=value[n]

  
其中name[i]表示變量名,它是在FORM表中某輸入域的名字;value[i]表示變量值,它是用戶在FORM表中某輸入域中輸入的值。客戶端傳輸數據的每對″name=value″串由′&′字符分隔,其數據編碼類型可以從環境變量CONTENT—TYPE獲取。CGI/1.1版僅支持“application/x-www-form-urlencoded”編碼方式。這種編碼方式和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等解釋語言,服務器必須安裝相應的解釋器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM