原文:CGI Made Really Easy,在翻譯的過程中,我增加了一些我在學習過程中找到的更合適的資料,和自己的一些理解。不能算是嚴格的翻譯文章,應該算是我的看這篇文章的過程的隨筆吧。
CGI真的很簡單
在此之前,你或許聽說過很多說CGI‘晦澀難懂’的言論。如果你會寫最基本的輸入輸出,那么你就可以寫出一個CGI腳本。如果你已經是一個程序員,你只需要幾分整就可以明白CGI到底是個什么東西。如果你還不是一個名程序員,對不起這篇文章不是很適合你,你可以先去學習一些編程的知識,例如腳本語言或者shell編程。但你學完了這些,再回過頭來看!那么讓我們開始吧!
這篇文章是寫一個CGI腳本用於處理HTML提交的表單。雖然跳過了一些細節,但是可以讓你在短時間內搞明白。
什么是CGI?
CGI不是一門編程語言。它是網頁的表單和你寫的程序之間通信的一種協議。可以用任何語言寫一個CGI腳本,這些語言只要能接收輸入輸出信息,讀取環境變量。所以,幾乎所有的編程語言都能寫一個CGI腳本,例如:python(把我大python放在第一個!),C,甚至是shell腳本。
CGI腳本的結構
典型的CGI腳本做了如下的事情:
- 讀取用戶提交表單的信息。
- 處理這些信息(也就是實現業務)。
- 輸出,返回html響應(返回處理完的數據)。
下面主要解釋,第一步和最后一步
讀取用戶提交的表單
當用戶填寫完表單,點擊提交按鈕的時候。CGI腳本接收用戶表單的數據,這些數據都是k-v的集合的形式(也就是python中的字典)。這里有寫實現的例子:python
如果你已經通過上面的例子看懂了,下面的就可以忽略了。如果你還有些不懂請看下面來那兩個長的字符串。
- “name1=value1&name2=value2&name3=value3”
- "name1=value1;name2=value2;name3=value3"
區別就是:‘&’和‘;’這兩個符號,他們的作用都是分隔參數。下面還有兩件事情要做。
- 把所有的‘+’變成‘空格’
- 把所有的符號都轉譯成‘%xx’樣式的符號,例如:‘%3d’轉化成‘=’
這樣做是為了統一用戶的輸入,使用統一的URL-encoded進行轉譯。
那么你從哪里得到這些轉譯完的字符串呢?根據提交時的時候選用的是什么HTTP方法:
- GET方法,環境變量是通過URL來傳遞的,例如:我google‘URL encoded’ 點擊搜索提交的請求就是: https://www.google.co.jp/search?q=URL+encoded(我省略其他一些干擾項,注意‘空格’轉化成了‘+’
- POST方法,通過HTTP消息主體傳遞的。注意:POST方法編碼類型有:application/x-www-form-urlencoded 或 multipart/form-data。
我找了一個很好的資料,很短,一路了然:POST對比GET方法
總結:CGI接收的用戶數據,是通過http協議傳遞過來的。而選用不同的‘Method’:GET或POST對CGI的接收沒有任何影響。這段是讓你明白:數據是怎么通過http協議傳輸的。
發送響應(Response)返回給用戶
首先,第一行要寫:Content-type: text/html
新起一行,用於輸出數據。寫好HTML響應頁面。這個頁面是:當你的腳本處理完數據后,返回給用戶的結果。
是的,你可以隨意編寫返回的HTML代碼。HTML很簡單,而且方便。
我的總結
CGI是一種通信協議,它把用戶傳遞過來的數據轉變成一個k-v的字典。這個字典中不光有用戶的數據,還有HTTP協議的參數。它做的就是把數據,組織成一個固定結構形式的數據。方便任何符合CGI協議的程序都可以調用!但是CGI不是負責通信(傳輸數據)的,通信的話是通過socket,也就是server
,例如上面例子中,是通過Apache進行通信。之后調用CGI腳本,把數據轉變成符合CGI協議的數據結構,用於后面的數據處理!
這個系列文章完成后,后面還有一個實戰系列。從頭寫一個web服務器,敬請期待!