如何編寫CGIC應用程序
如何在CGIC生成圖片?
CGI調試功能:使用捕獲
Cgic函數參考
Cgic可變參考
Cgic結果編碼參考
Cgic快速索引
壹般UNIX系統都支持ANSIC,CGI可以通過添加相應的庫函數(以及相應的H文件)來實現。這裏我推薦壹個用於CGI編程的ANSIC庫:cgic。
Cgic是壹個C語言庫,用於生成基於CGI的WWW應用程序。它具有以下功能:
*解析數據。
*接收以兩種方式發送的數據:GET和PSOT。
*將表單中的不同字段連接成壹個連續的字符串。
*提供字符串、整數、浮點以及單選和多選功能,用於檢索表單數據。
*為數值字段提供邊界檢測
*將CGI環境變量加載到非空C字符串中。
*捕獲用於調試的CGI狀態。
*提供相對安全的系統調用功能。
cgic程序可以用通用的ANSI C或C++編譯器編譯,但與通用的C程序不同,用cgic編寫的源代碼的主要函數是cgiMain(),而不是通常的main()。cgic的庫會自動將cgiMain連接到相應的Main()。
-
編寫CGIC程序
註意:所有cgic應用程序必須連接到cgic.c .
用cgimain()替換main()必須包含:# include "cgic.h。"
基本結構cgictest.c:
int cgiMain() {
#如果調試
/*如果我們正在調試,加載壹個保存的CGI場景*/
CGI readenvironment("/path/to/cap CGI . dat ");
#endif
/*重要:我們必須指明文檔的類型*/
cgiHeaderContentType(" text/html ");
/*現在調用其他函數來處理表單的每個部分*/
fprintf(cgiOut," & ltHTML & gt& ltHEAD & gt\ n ");
fprintf(cgiOut," & ltTITLE & gtcgic測試<。/TITLE & gt;& lt/HEAD & gt;\n "):
fprintf(cgiOut," & ltBODY & gt& lth 1 & gt;cgic測試<。/h 1 & gt;\ n ");
name();
address();
餓();
溫度();
青蛙();
color();
口味();
none buttons();
單選按鈕();
fprintf(cgiOut," & lt/BODY & gt;& lt/HTML & gt;\ n ");
/*這個值將是程序的退出代碼;0
通常表示在Unix和DOS程序中成功*/
返回0;
}
捕獲
輸出標題
CgiHeaderContentType()在輸出文檔之前簡要描述了MIME內部類型,比如“text/html”。
CgiHeaderStatus()替換輸出錯誤代碼cgiHeaderLocation(),而不是重定向到其他頁面。獨立應用程序中只能有壹個cgiHeader函數。
重要提示:在cgiHeader函數組中,cgiHeaderContentType()在向瀏覽器輸出任何內容之前被調用。否則,將會出現錯誤或瀏覽器無法識別。cgiOut
然後,cgiMain()調用不同的函數。當函數完成時,它將返回0。
處理輸入文本
void Name() {
char name[81];
cgiformstringnewlines(" name ",名稱,81);
fprintf(cgiOut," Name:% s & lt;BR & gt\n ",名稱);
}
該函數的功能是檢索和顯示用戶輸入的名稱。
處理輸出
重要提示:cgiOut通常等同於stdout。
CgiFormString確保導航的暫停
處理單個復選框輸入
hungry()函數確定用戶是否選擇了復選框“Hungry”:
void Hungry() {
if(cgiformcheckbox single(" hungry ")= = cgiFormSuccess){
fprintf(cgiOut,“我餓了!& ltBR & gt\ n ");
}否則{
fprintf(cgiOut,“我不餓!& ltBR & gt\ n ");
}
}
該函數依賴cgiFormCheckboxSingle()來確定是否選中了壹個復選框。CgiFormCheckboxSingle()接受復選框名稱的屬性值,如果存在則返回cgiFormSuccess,否則返回cgiFormNotFound。如果有多個復選框,請使用cgiFormCheckboxMultiple()和cgiFormStringMultiple()的函數。
處理數字輸入
Temperature()返回浮點本的值,以確保它在特定的返回範圍內。
空隙溫度(){
雙溫;
cgiFormDoubleBounded("溫度",& amp溫度,80.0,120.0,98.6);
fprintf(cgiOut,"我的體溫是%f。BR & gt\n”,溫度);
}
通過cgiFormDoubleBounded()獲取數據。第壹個數據是返回數據中輸入字段的名稱。最後壹個值是用戶不提交時的默認值。
該函數總是在特定的返回中檢索適當的值;檢查cgiFormDoubleBounded返回的值,以確保用戶輸入的數據在指定的範圍內,而不是其他無效數據。請參閱有關cgiFormDoubleBounded()的更多信息。如果限制檢查不令人滿意,可以使用cgiFormDouble()來代替。
在整數輸入中,可以使用cgiFormInteger和cgiFormIntegerBounded。這些函數具有相似的功能。
處理單項選擇輸入
& lt選擇& gtHTML標簽用於為用戶提供多種選擇。對於單選按鈕和復選框椰子油,選擇的數量很少。顏色()。
char *colors[] = {
“紅色”,
“綠色”,
“藍色”
};
空心顏色(){
int顏色選擇;
cgiFormSelectSingle("colors ",顏色,3 & amp;colorChoice,0);
fprintf(cgiOut,"我是:% s & ltBR & gt\n ",colors[color choice]);
}
該功能確定用戶已經從以下選項中選擇了幾個選項
CgiFormSelectSingle()總是顯示合理的選項值。
單選按鈕也可以使用該功能。另外還有cgiFormRadio(),也是壹樣的。
處理多項選擇輸入
非按鈕()
char *votes[] = {
" A "
" B "
" C "
" D "
};
void none buttons(){
int voteChoices[4];
int I;
int結果;
int無效;
char * *響應;
/*方法#1:檢查有效投票。這是個好主意,
因為不存在的候選人的選票可能應該
被打折扣...*/
fprintf(cgiOut," Votes(方法1):& lt;BR & gt\ n ");
result = cgiformcheckbox multiple(" vote ",票數,4,
voteChoices & amp;無效);
if (result == cgiFormNotFound) {
fprintf(cgiOut,“我討厭他們所有人!& ltp & gt\ n ");
}否則{
fprintf(cgiOut,"我的首選候選項是:\ n ");
fprintf(cgiOut," & ltul & gt\ n ");
for(I = 0;(我& lt4);i++) {
if (voteChoices[i]) {
fprintf(cgiOut," & lt李& gt%s\n ",票數[I]);
}
}
fprintf(cgiOut," & lt/ul & gt;\ n ");
}
請參考cgiformCheckboxMultiple(),cgiformSelectMultiple()。
cgiformcheckbox multiple()cgiformcheckbox multiple
cgictest.c中使用了NonExButtons()函數:
/*方法2:獲得所有投票的名字,並信任他們。
如果表單會更頻繁地改變,這是很好的
那麽代碼和發明的反應就不會有危險
或者可以用其他方式檢查。*/
fprintf(cgiOut," Votes(方法2):& lt;BR & gt\ n ");
result = cgiFormStringMultiple(" vote ",& amp回復);
if (result == cgiFormNotFound) {
fprintf(cgiOut,“我討厭他們所有人!& ltp & gt\ n ");
}否則{
int I = 0;
fprintf(cgiOut,"我的首選候選項是:\ n ");
fprintf(cgiOut," & ltul & gt\ n ");
while (responses[i]) {
fprintf(cgiOut," & lt李& gt%s\n ",responses[I]);
i++;
}
fprintf(cgiOut," & lt/ul & gt;\ n ");
}
/*我們必須確保釋放字符串數組或內存
會發生泄漏。簡單地調用free()將釋放
數組而不是單個字符串。這
函數cgiStringArrayFree()完全完成了這項工作。*/
cgiStringArrayFree(響應);
}
請參考cgiFormStringMultiple()
cgiFormStringMultiple()
/*字符串數組;每個C字符串都是壹個字符數組*/
char * *響應;
cgiFormStringMultiple("vote ",& amp回復);
檢查CGI環境變量
這裏將使用的變量,
產生圖像
#包含“cgic.h”
#包含“gd.h”
char *colors[] = {
“紅色”、“綠色”、“藍色”
};
#定義顏色總計3
int cgiMain() {
int colorChosen
gdImagePtr im
int r,g,b;
/*使用gd創建圖像*/
im = gdImageCreate(64,64);
r = gdimagecolorlallocate(im,255,0,0);
g = gdimagecolorlallocate(im,0,255,0);
b = gdimagecolorlallocate(im,0,0,255);
/*現在使用cgic找出用戶要求的顏色*/
cgiFormSelectSingle("color ",3 & amp;colorChosen,0);
/*現在用想要的顏色填充*/
開關(顏色選擇){
案例0:
gdImageFill(im,32,32,r);
打破;
案例1:
gdImageFill(im,32,32,g);
打破;
案例二:
gdImageFill(im,32,32,b);
打破;
}
/*現在輸出圖像。註意內容類型!*/
cgiHeaderContentType(" image/gif ");
/*將圖像發送到cgiOut */
gdImageGif(im,CGI out);
/*釋放gd映像*/
gdImageDestroy(im);
返回0;
}
捕獲用於調試的CGI狀態
Cgic函數參考
cgiFormResultType cgiFormString(char * name,char *result,int max)
用於從輸入字段復制字符串。他將域名max-1字節中的字符復制到緩沖區結果中。如果域不存在,將壹個空字符串復制到結果緩沖區。在此函數中,所有新行都由換行符表示。
cgiFormResultType cgiFormStringNoNewlines(char * name,char *result,int max)
它類似於cgiFormString函數,只是刪除了所有的CR和LF。
cgiFormResultType cgiformstringspaceneed(char * name,int *length)
它返回指向name的字符串的長度,並將該長度放入length中。
cgiFormResultType cgiFormStringMultiple(char * name,char ***ptrToStringArray)
如果同壹個名字有多個輸入字段,或者字段中的字符串可以動態改變,那麽您可以使用這個函數。它將所有名為name的輸入字段的值放在prtToStringArray中。
void cgiStringArrayFree(char * * string array)
它釋放分配給stringArray的內存。
cgiFormResultType cgiFormInteger(char * name,int *result,int defaultV)
從輸入字段中取出壹個整數,放入結果中。
cgiFormResultType cgiFormIntegerBounded(char * name,int *result,int min,int max,int defaultV)
如果輸入字段中的整數在界限內,就取出來放到結果中。
cgiFormResultType cgiFormDouble(char * name,double *result,double defaultV)
從輸入字段中取出壹個浮點數,放入結果中。
cgiFormResultType cgiFormDoubleBounded(char * name,double *result,double min,double max,double defaultV)
如果輸入字段中的浮點數在界限內,就取出來放到結果中。
cgiFormResultType cgiFormSelectSingle(char * name,char * * choicesText,int choicesTotal,int *result,int defaultV)
去掉復選框(在select語句之後),將選中的名稱復制到choicesText,將選中的數字復制到choicesTotal,將當前選擇復制到result。
cgiFormResultType cgiFormSelectMultiple(char * name,char * * choicesText,int choicesTotal,int *result,int *invalid)
類似於cgiFormSelectSingle,只指向整數數組的結果表示選中的項目。
cgiFormResultType cgiformcheckbox single(char * name)
如果選中該復選框,該函數將返回cgiFormSuccess,否則將返回cgiFormNotFound。
cgiFormResultType cgiformcheckbox multiple(char * name,char **valuesText,int valuesTotal,int *result,int *invalid)
類似於cgiFormCheckboxSingle,但它處理同名的多個復選框的情況。名稱指向復選框的名稱;ValuesText指向包含每個復選框中的參數的數組;ValuesTotal指向復選框的總數;Result是壹個整數數組,每個復選框用1表示,未選中的用0表示。
cgiFormResultType cgiFormRadio(char * name,char **valuesText,int valuesTotal,int *result,int defaultV)
類似於cgiFormCheckboxMultiple,除了這裏是單選按鈕而不是復選框。
void cgiHeaderLocation(char * redirectUrl)
重定向到由redirectUrl指定的URL。
void cgiHeaderStatus(int status,char *statusMessage)
輸出狀態代碼狀態和消息狀態消息。
void cgiHeaderContentType(char * mime type)
用來告訴瀏覽器返回什麽類型的文檔。
cgiEnvironmentResultType CGI write environment(char * filename)
這個函數將當前的CGI環境寫入文件名文件,以便以後調試。
cgiEnvironmentResultType cgiread environment(char * filename)
這個函數從文件名文件中讀取CGI環境進行調試。
int cgiMain()
壹個程序必須寫這個函數,這是主程序開始的地方。
Cgic可變參考
本節提供了cgic提供的各種全局變量的參考指南,供程序員使用。這些變量應該總是優先於stdin、stdout和getenv()調用使用,以確保與cgic CGI調試特性的兼容性。
大部分變量等價於各種CGI變量,重要的是VGIC變量不能為空。
char *cgiServerSoftware
服務器軟件名稱、空字符串或未知的空字符串。
char *cgiServerName
返回服務器名稱或為空。
char *cgiGatewayInterface
網關接口(通常為CGI/1.1),或者為空。
char *cgiServerProtocol
網絡協議(通常為HTTP/1.0),或者為空。
char *cgiServerPort
服務器端口(通常為80),或者為空。
char *cgiRequestMethod
平時得到的還是帖子,還是空的。
char *cgiPathInfo
指示附加虛擬路徑
char *cgiPathTranslated
指出附加的虛擬路徑,並將其從服務器路徑更改為本地路徑。
char *cgiScriptName
調用程序的名稱
char *cgiQueryString
包括GET-method請求或者
char *cgiRemoteHost
從瀏覽器返回客戶端主機的名稱。
char *cgiRemoteAddr
從瀏覽器返回客戶的IP地址。
char *cgiAuthType
返回用戶授權信息
char *cgiRemoteUser
身份驗證用戶cgiAuthType。
char * cgiremotedintent
返回用戶名是不安全的(用戶與用戶有堅定的約定),尤其是在Windows系統中。
char *cgiContentType
返回MIME內部類型
char * cgiAccept
請參考cgiheadercontype () cgiuser代理。
char *cgiUserAgent
檢索到的用戶瀏覽器信息
char *cgiReferrer
指向用戶訪問的URL。
int cgiContentLength
表單或查詢數據的字節被認為是標準的。
文件*cgiOut
CGI輸出。cgiHeader函數和cgiHeaderContentType壹樣,首先用於輸出mime頭;用於fprintf()和fwrite()的cgiout通常等同於stdout。
文件*cgiIn
CGI輸入。大部分時間妳不會需要這個功能。
Cgic結果編碼參考
在大量的專欄中,cgic函數系統地產生合理的結果,即使在瀏覽器和用戶不合理的情況下。無論如何,有時候知道不合理的事情發生,特別是給出壹個值或者定義壹個範圍,是壹個不充分的解決方案。以下結果代碼有助於更好地理解。
cgiFormSuccess
信息提交成功。
cgiFormTruncated
刪除壹些字節。
cgiFormBadType
輸入信息不正確(不符合要求)
cgiFormEmpty
提交信息為空。
cgiFormNotFound
未找到提交信息。
cgiFormConstrained
數字屬於壹個特定的範圍,並被迫低於或高於適當的範圍。
cgiFormNoSuchChoice
不接受單項選擇提交的值。通常情況下,表和程序是有矛盾的。
環境問題
嘗試從CGI環境或獲取的文件中讀取或寫入失敗,並報告了I/O錯誤。
cgien環境內存
嘗試從CGI環境或獲取的文件中讀取或寫入失敗,並報告了內存不足錯誤。
cgienenvironmentsuccess
從CGI環境或獲取的文件中讀取或寫入的嘗試成功。
Cgic快速索引