1. 程式人生 > >【網路】CGI入門!!

【網路】CGI入門!!

概念:
CGI:通用閘道器介面(Common Gateway Interface)是一個Web伺服器主機提供資訊服務的標準介面。通過CGI介面,Web伺服器就能夠獲取客戶端提交的資訊,轉交給伺服器端的CGI程式進行處理,最後返回結果給客戶端。
組成CGI通訊系統的是兩部分:一部分是html頁面,就是在使用者端瀏覽器上顯示的頁面。另一部分則是執行在伺服器上的Cgi程式。

工作原理:
這裡寫圖片描述
伺服器和客戶端之間的通訊,是客戶端的瀏覽器和伺服器端的http伺服器之間的HTTP通訊,我們只需要知道瀏覽器請求執行伺服器上哪個CGI程式就可以了,其他不必深究細節,因為這些過程不需要程式設計師去操作。

伺服器和CGI程式之間的通訊才是我們關注的。一般情況下,伺服器和CGI程式之間是通過標準輸入輸出來進行資料傳遞的,而這個過程需要環境變數的協作方可實現。

環境變數:
對於CGI程式來說,它繼承了系統的環境變數。CGI環境變數在CGI程式啟動時初始化,在結束時銷燬。

當一個CGI程式不是被HTTP伺服器呼叫時,它的環境變數幾乎是系統環境變數的複製。

當這個CGI程式被HTTP伺服器呼叫時,它的環境變數就會多了以下關於HTTP伺服器、客戶端、CGI傳輸過程等專案。

REQUEST_METHOD | 伺服器與CGI程式之間的資訊傳輸方式
QUERY_STRING | 採用GET時所傳輸的資訊
CONTENT_LENGTH | STDIO中的有效資訊長度
CONTENT_TYPE | 指示所傳來的資訊的MIME型別
CONTENT_FILE | 使用Windows HTTPd/WinCGI標準時,用來傳送資料的檔名
PATH_INFO
| 路徑資訊
PATH_TRANSLATED | CGI程式的完整路徑名
SCRIPT_NAME | 所呼叫的CGI程式的名字與伺服器相關的環境變數
GATEWAY_INTERFACE | 伺服器所實現的CGI版本
SERVER_NAME | 伺服器的IP或名字
SERVER_PORT | 主機的埠號
SERVER_SOFTWARE|呼叫CGI程式的HTTP伺服器的名稱和版本號與客戶端相關的環境變數
REMOTE_ADDR | 客戶機的主機名
REMOTE_HOST | 客戶機的IP地址
ACCEPT | 列出能被次請求接受的應答方式
ACCEPT_ENCODING | 列出客戶機支援的編碼方式
ACCEPT_LANGUAGE | 表明客戶機可接受語言的ISO程式碼
AUTORIZATION | 表明被證實了的使用者
FORM | 列出客戶機的EMAIL地址
IF_MODIFIED_SINGCE|當用get方式請求並且只有當文件比指定日期更早時才返回資料
PRAGMA | 設定將來要用到的伺服器代理
REFFERER | 指出連線到當前文件的文件的URL
USER_AGENT | 客戶端瀏覽器的資訊
CONTENT_TYPE:如application/x-www-form-urlencoded,表示資料來自HTML表單,並且經過了URL編碼。
ACCEPT:客戶機所支援的MIME型別清單,內容如:”image/gif,image/jpeg”
REQUEST_METHOD:它的值一般包括兩種:POST和GET,但我們寫CGI程式時,最後還要考慮其他的情況。

1.POST方法
如果採用POST方法,那麼客戶端來的使用者資料將存放在CGI程序的標準輸入中,同時將使用者資料的長度賦予環境變數中的CONTENT_LENGTH。客戶端用POST方式傳送資料有一個相應的MIME型別(通用Internet郵件擴充服務:Multi-purpose Internet Mail Extensions)。目前,MIME型別一般是:application/x-wwww-form-urlencoded,該型別表示資料來自HTML表單。該型別記錄在環境變數CONTENT_TYPE中,CGI程式應該檢查該變數的值。

2.GET方法
在該方法下,CGI程式無法直接從伺服器的標準輸入中獲取資料,因為伺服器把它從標

準輸入接收到得資料編碼到環境變數QUERY_STRING(或PATH_INFO)。

GET與POST的區別:採用GET方法提交HTML表單資料的時候,客戶機將把這些數

據附加到由ACTION標記命名的URL的末尾,用一個包括把經過URL編碼後的資訊與CGI程式的名字分開:http://www.mycorp.com/hello.html?name=hgq$id=1,QUERY_STRING的值為name=hgq&id=1

有些程式設計師不願意採用GET方法,因為在他們看來,把動態資訊附加在URL的末尾有

違URL的出發點:URL作為一種標準用語,一般是用作網路資源的唯一定位標示。

環境變數是一個儲存使用者資訊的記憶體區。當客戶端的使用者通過瀏覽器發出CGI請求時,伺服器就尋找本地的相應CGI程式並執行它。在執行CGI程式的同時,伺服器把該使用者的資訊儲存到環境變數裡。接下來,CGI程式的執行流程是這樣的:查詢與該CGI程式程序相應的環境變數:第一步是request_method,如果是POST,就從環境變數的len,然後到該程序相應的標準輸入取出len長的資料。如果是GET,則使用者資料就在環境變數的QUERY_STRING裡。

3.POST與GET的區別
以 GET 方式接收的資料是有長度限制,而用 POST 方式接收的資料是沒有長度限制的。並且,以 GET 方式傳送資料,可以通過URL 的形式來發送,但 POST方式傳送的資料必須要通過 Form 才到傳送。

int get_inputs(){
int length;
char *method;
char *inputstring;
method = getenv(“REQUEST_METHOD”); //將返回結果賦予指標
if(method == NULL)
    return 1;       //找不到環境變數REQUEST_METHOD
if(!strcmp(method, ”POST”))  // POST方法
{
    length = atoi(getenv(“CONTENT_LENGTH”));     //結果是字元,需要轉換
    if(length != 0)
    {
        inputstring = malloc(sizeof(char)*length + 1)     //必須申請快取,因為stdin是不帶快取的。
        fread(inputstring, sizeof(char), length, stdin);     //從標準輸入讀取一定資料
}
}
else if(!strcmp(method, “GET”))
{
    Inputstring = getenv(“QUERY_STRING”);   
    length = strlen(inputstring);
}
if(length == 0)
return 0;
}