標籤:
測試中偶爾會有這樣的需求:
1.需要訪問外網的cgi或連結地址,但訪問不通
2.需要構造cgi特定的返回,但正常情況下難以構造
為了獲得想要的結果,此時可以類比http請求的返回滿足測試需要
方法一:直接擷取結果檔案
在apache配置的對應路徑下建立一個檔案,如
DocumentRoot /data/server/xxxx/htdocs
然後用IP/檔案名稱來訪問,或者放在alias指定的檔案夾下面
建立一個檔案名稱字,比如result,鍵入以下內容:
result=0&res_info=OK
在瀏覽器裡直接輸入http://xxx.xxx.xxx.xxx/result,訪問該檔案,可以看到返回結果
這個只是相當於把檔案內容給取出來了,如果真正類比cgi的返回的話我一般用shell寫個樁cgi
方法二:寫一個樁cgi
什麼是cgi,見apache指南:cgi
http://man.chinaunix.net/newsoft/ApacheManual/howto/cgi.html
簡言之,要自己寫一個cgi需要如下條件:1.apache配置支援cgi
一般機器上有部署過cgi,在該目錄下編寫一個自己寫的cgi是不會有什麼不支援的問題,如果是在其他目錄新部署自己的cgi,也許會遇到apache的支援問題
如,直接在剛才的目錄下面建立一個shell指令碼,如test.sh
#!/bin/shprint "result=0&res_info=OK"
再在瀏覽器裡運行,啟動並執行結果就是把這個指令檔下載下來,而不是執行輸出
必須配置Apache以允許CGI的執行,其方法有多種:
(1)ScriptAlias
ScriptAlias指令使Apache允許執行一個特定目錄中的CGI程式。當用戶端請求此特定目錄中的資源時,Apache假定其中檔案都是CGI程式並試圖運行。
ScriptAlias指令形如:
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
如果Apache被安裝到預設的位置,預設的設定檔httpd.conf中則會有上述配置。ScriptAlias指令定義了映射到一個特定目錄的URL首碼,與Alias指令非常相似,兩者一般都用於指定位於DocumentRoot目錄以外的目錄,其區別是ScriptAlias又多了一層含義,即其URL首碼中任何檔案都被視為CGI程式。所以,上述例子會指示Apache,/cgi-bin/應該指向/usr/local/apache/cgi-bin/目錄,且視之為CGI程式。
(2)用Options顯式地允許CGI的執行
可以在主伺服器設定檔中,使用Options指令顯式地允許特定目錄中CGI的執行:
<Directory /usr/local/apache/htdocs/somedir>Options +ExecCGI</Directory>
上述指令使Apache允許CGI檔案的執行。另外,還必須告訴伺服器哪些檔案是CGI檔案。下面的AddHandler指令告訴伺服器所有帶有cgi或pl尾碼的檔案是CGI程式:
AddHandler cgi-script cgi pl
(3).htaccess檔案
在主伺服器配置中如此配置:
AllowOverride Options
在.htaccess檔案中,需要如此配置:
Options +ExecCGI
以使Apache允許此目錄中CGI程式的執行。
2.按照cgi的格式輸出內容
在CGI程式的所有輸出前面必須有一個MIME類型的頭,即HTTP頭
有三個類型的頭部: Content-type, Location, 和Status. Content-type 最普遍的。
有關content-type解釋可以見有關HTML的說明, 一個你可以發出的特定編碼象這樣:Content-type: text/html在這個例子中,輸出資料的類型是text/html; 換句話說, 他是個HTML檔案. 其他詳盡的說明參照apache文檔
基本使用方法是
echo "xxxxxxx"echo ""
其他詳盡的說明參照apache文檔
看完了1和2後可以做一個簡單的demo:
apache配置為:
ScriptAlias /cgi-bin/ /data/server/xxxxxx/htdocs/cgi-bin/
在目錄下建立檔案test.sh(寫成test.cgi可能會逼格高一點,實際是一樣的)
#!/bin/shecho "Content-type:text/html;charset=UTF8\n"echo ""echo "result=0&res_info=OK"
執行後應該能夠返回
result=0&res_info=OK
再讓我們幹點cgi應該乾的事情,解析輸入,進行處理,再輸出
這裡要能夠擷取請求串中的參數就需要從環境變數env中取出REQUEST_METHOD和QUERY_STRING
REQUEST_METHOD為提交方式 get或post
QUERY_STRING為請求參數串,可能需要自己分割處理下
比如我需要調一個cgi查詢手機號的驗證碼,傳入的是手機號,處理邏輯是sql查詢,返回的是查詢結果
#!/bin/shecho "Content-type:text/html;charset=UTF8\n"echo ""method="$REQUEST_METHOD"mobile=`echo $QUERY_STRING | cut -d "=" -f2`y=${mobile:0-3:1}xx=${mobile:0-2:2}verifycode=""verifycode=`mysql -uroot -p111111 -e "select Fverify_code from verify_code_$xx.t_code_$y where Fmobile_no=‘$mobile‘ order by Fcreate_time desc limit 1"|grep -v Fverify_code`
if [ !-n $verifycode ]; thenecho "fail"elseecho $verifycodefi
curl "http://172.27.207.203:23080/wx_pay/v1.0/wx_get_sms.cgi?mobile=13xxxxxxxxxx” 或直接在瀏覽器中訪問,返回的就是驗證碼,若不帶參數或者mobile錯誤,則返回的是"fail"
類比HTTP請求的返回&shell寫cgi