轉(zhuǎn)自:http://www.cnblogs.com/moonlove/archive/2012/02/22/2509147.html
英文原文地址:http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm
一 什么是CGI
CGI(The Common Gateway Interface):通用網(wǎng)關(guān)接口,定義web服務(wù)器和客戶腳本進(jìn)行信息交互的一系列標(biāo)準(zhǔn)。
二 web瀏覽器
為了了解CGI的概念,讓我們來看看當(dāng)我們單擊一個(gè)超鏈接來瀏覽一個(gè)特定的web頁或URL的時(shí)候,背后會發(fā)生什么事?
(1)瀏覽器首先會鏈接HTTP web 服務(wù)器并且請求一個(gè)URL 頁面;
(2) WEB服務(wù)器將會解析這個(gè)URL并且查詢請求的文件名,如果找到了請求文件服務(wù)器就會將這個(gè)文件發(fā)送回瀏覽器,否則發(fā)送回一個(gè)包含錯(cuò)誤信息提示的頁面指示你請求的是一個(gè)服務(wù)器并不包含的文件。
(3)WEB瀏覽器將接受來自服務(wù)器端的響應(yīng),并且向發(fā)出請求的用戶顯示接收到的文件。
然而,HTTP服務(wù)器也可能會以如何這種方式進(jìn)行配置,那就是無論什么時(shí)候接受到對特定目錄下的文件的請求,服務(wù)器不會將這個(gè)文件發(fā)送回客戶端,而是它作為一個(gè)程序被服務(wù)器執(zhí)行,并產(chǎn)生出輸出發(fā)送回客戶端瀏覽器進(jìn)行顯示。
CGI(The Common Gateway Interface)是一個(gè)標(biāo)準(zhǔn)化的協(xié)議,能夠使應(yīng)用程序(通常稱為CGI程序或CGI腳本)同web服務(wù)器和客戶端進(jìn)行交互。CGI程序能夠用Python, PERL, Shell, C or C++等語言來實(shí)現(xiàn)。
三 CGI程序結(jié)構(gòu)圖
下圖簡單的展示了CGI程序架構(gòu)
四 web服務(wù)器配置
在你著手寫CGI程序之前,確保你的web服務(wù)器支持CGI程序并且配置成處理CGI程序。所有的能夠被HTTP服務(wù)器執(zhí)行的CGI程序都被存放在預(yù)先配置好的目錄下面,這個(gè)目錄叫做CGI目錄,并且按照約定命名為 /var/www/cgi-bin,并且約定CGI文件的后綴名為.cgi ,盡管它們是c++可執(zhí)行文件。
一般的,Apache 服務(wù)器在/var/www/cgi-bin目錄下配置文件來運(yùn)行CGI程序,如果你想要聲明另外的目錄來運(yùn)行CGI腳本,你需要修改httpd.conf 文件中的部分內(nèi)容:
五 第一個(gè)CGI腳本
以下是一段簡短的CGI腳步代碼
編譯上述代碼并且將二進(jìn)制可執(zhí)行文件命名為cplusplus.cgi,保存路徑為/var/www/cgi-bin目錄下,運(yùn)行chmod 755 cplusplus.cgi 命令使得該文件為可執(zhí)行的?,F(xiàn)在,如果你點(diǎn)擊cplusplus.cgi然后就會產(chǎn)生如下輸出:
Hello World! This is my first CGI program
上面的C++程序是一個(gè)將輸出寫入標(biāo)準(zhǔn)輸出文件(stdout)的簡單程序。這段代碼中有一個(gè)很重要的一點(diǎn)那就是第一行代碼:Content-type:text/html\r\n\r\n,這行被發(fā)送回瀏覽器,指明瀏覽器顯示的文本類型。現(xiàn)在你應(yīng)該了解了CGI的基本概念了,你也可以使用python寫出更多復(fù)雜的CGI程序,C++ CGI程序能與其他任何外部系統(tǒng)進(jìn)行信息交互,例如像RDBMS。
六 HTTP報(bào)文頭部
這行字符串” Content-type:text/html\r\n\r\n”是發(fā)送回瀏覽器的HTTP報(bào)文頭部的一部分,所有的HTTP報(bào)文頭部都有如下格式:
下表中包含其他一些重要的HTTP報(bào)文信息,這些信息在CGI編程中經(jīng)常會用到。
Header | Description |
---|---|
Content-type: | A MIME string defining the format of the file being returned. Example is Content-type:text/html |
Expires: Date | The date the information becomes invalid. This should be used by the browser to decide when a page needs to be refreshed. A valid date string should be in the format 01 Jan 1998 12:00:00 GMT. |
Location: URL | The URL that should be returned instead of the URL requested. You can use this filed to redirect a request to any file. |
Last-modified: Date | The date of last modification of the resource. |
Content-length: N | The length, in bytes, of the data being returned. The browser uses this value to report the estimated download time for a file. |
Set-Cookie: String | Set the cookie passed through the string |
七 CGI環(huán)境變量
所有的CGI程序?qū)褂玫较铝械腃GI環(huán)境變量,這些變量在CGI程序中起著重要的作用。
Variable Name | Description |
---|---|
CONTENT_TYPE | The data type of the content. Used when the client is sending attached content to the server. For example file upload etc. |
CONTENT_LENGTH | The length of the query information. It's available only for POST requests |
HTTP_COOKIE | Return the set cookies in the form of key & value pair. |
HTTP_USER_AGENT | The User-Agent request-header field contains information about the user agent originating the request. Its name of the web browser. |
PATH_INFO | The path for the CGI script. |
QUERY_STRING | The URL-encoded information that is sent with GET method request. |
REMOTE_ADDR | The IP address of the remote host making the request. This can be useful for logging or for authentication purpose. |
REMOTE_HOST | The fully qualified name of the host making the request. If this information is not available then REMOTE_ADDR can be used to get IR address. |
REQUEST_METHOD | The method used to make the request. The most common methods are GET and POST. |
SCRIPT_FILENAME | The full path to the CGI script. |
SCRIPT_NAME | The name of the CGI script. |
SERVER_NAME | The server's hostname or IP Address |
SERVER_SOFTWARE | The name and version of the software the server is running. |
下面這段代碼列出了所有的CGI變量,點(diǎn)擊Get Environment可看結(jié)果。
八 C++CGI庫
在該FTP服務(wù)器上ftp://ftp.gnu.org/gnu/cgicc/ 提供了C++ CGI庫以供下載,我們從上面下載CGI 庫并一下步驟進(jìn)行安裝:
$tar xzf cgicc-X.X.X.tar.gz
$cd cgicc-X.X.X/
$./configure --prefix=/usr
$make
$make install
并且你可以閱讀相關(guān)文檔。C++ CGI Lib Documentation 。
九 GET 與POST方法
當(dāng)你需要從瀏覽器客戶端傳遞信息至web服務(wù)器端并最終送至CGI程序的時(shí)候,你將必然會遇到很多的問題。大部分的瀏覽器使用兩種方法發(fā)送信息至瀏覽器:GET方法和POST方法,進(jìn)行過WEB開發(fā)的人應(yīng)該對其很熟悉。
1. 使用GET方法發(fā)送信息
GET方法將編碼過的用戶信息附加在頁面請求上發(fā)送,頁面請求和這些編碼信息使用?進(jìn)行分割,如下所示:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
GET方法是瀏覽器發(fā)送信息之服務(wù)器端所采用的默認(rèn)的方法,采用這種方法發(fā)送時(shí),在你的瀏覽器地址欄上在URL后面會附加上一串字符串,如果你傳輸密碼或其他敏感信息至服務(wù)器端的時(shí)候不要使用GET方法,GET方法有長度限制,在一個(gè)請求字符串中,最多只能發(fā)送1024的字符。
當(dāng)使用GET方法的時(shí)候,HTTP報(bào)文頭采用QUERY_STRING發(fā)送信息,并且將通過QUERY_STRING環(huán)境變量進(jìn)入你的CGI程序。
您能夠使用簡單的鍵-值組合附加在URL后傳遞信息,或者你也可使用HTML中的<FORM>標(biāo)簽通過使用GET方法來傳遞信息。
2. 使用POST方法發(fā)送信息
CGI程序中較為通用的且更為可靠地傳遞信息的方法是POST方法,POST傳遞的報(bào)文信息和GET方法沒什么兩樣,但是跟GET方法的將字符串信息附加于URL之后并且用?分隔有所區(qū)別的是,POST方法使用分離的報(bào)文段分別發(fā)送URL和要傳輸?shù)男畔ⅰ_@些信息會被CGI腳本以標(biāo)準(zhǔn)輸入的形式接收。
(注:在原文中作者給出了HTML各種控件傳遞信息給CGI腳本的例子,有興趣的朋友可以去看看)
十 在CGI中使用Cookies
服務(wù)器可能會以Cookies的形式發(fā)送數(shù)據(jù)給客戶端瀏覽器上,瀏覽器也許會接收這些Cookies,并且會以簡單文本的形式存儲在用戶的硬盤上,當(dāng)用戶訪問該web站點(diǎn)的另外頁面的時(shí)候,這些Cookies就會有用處了,服務(wù)器就會據(jù)此知道用戶記錄了那些信息。
Cookies信息格式包含如下5個(gè)變量:
(1) Expires:包含Cookies的過期信息。如果變量值為空,當(dāng)客戶端關(guān)閉瀏覽器時(shí),Cookies就會過期。
(2) Domain:web站點(diǎn)的域名信息。
(3) Path:設(shè)置Cookies的web頁或目錄的路徑。如果想要從任何頁面或目錄獲取Cookies信息,此變量設(shè)為空值。
(4) Secure:如果該字段設(shè)置為"secure",那么Cookies將只能被安全服務(wù)器獲取,如果該字段為空,則沒有該限制。
(5) Name=Value:Cookies以鍵-值對的形式設(shè)置或獲取。
1. 設(shè)置Cookies
發(fā)送Cookies信息至瀏覽器是非常容易的,這些Cookies將會附加在在HTTP報(bào)文頭的Content-type域前。假設(shè)你想要以Cookies的方式設(shè)置UserID和Password,那么簡單的CGI設(shè)置腳本如下:
從這個(gè)例子中你將了解怎么設(shè)置Cookies,那就是使用Set-Cookie來設(shè)置Cookies。
設(shè)置Cookies屬性的時(shí)候,Expires, Domain, and Path是可選的,值得注意的一點(diǎn)是Cookies的設(shè)置是在發(fā)送"Content-type:text/html\r\n\r\n”之前。運(yùn)行/cgi-bin/setcookies.cgi將會在你的電腦上設(shè)置Cookies。
2.獲取Cookies
獲取Cookies也非常簡單,Cookies都存儲在CGI的環(huán)境變量HTTP_COOKIE中,并且具有如下的格式:
key1=value1;key2=value2;key3=value3....
以下就是一段獲取Cookies的簡短的CGI代碼:
點(diǎn)擊/cgi-bin/getcookies.cgi看看效果,將會顯示出之前設(shè)置過的Cookies。
譯自:http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm (部分略去未譯)。