1. 程式人生 > >CGI程式中POST和GET訊息的處理

CGI程式中POST和GET訊息的處理

 資料傳送格式 當用戶填完表格並按了SUBMIT按鈕後,Web瀏覽器並非將使用者所填的資料直接送給Web伺服器, 而先要經過一定的編碼處理。 Web瀏覽器總是將資料按照“變數名=變數值”這樣的資料對格式進行編碼,並且每對資料之間 用一個&符號相連線。其中“變數名”就是Form元素中的NAME屬性值;“變數值”則是使用者在 輸入框中所輸入的資料,或者是使用者所選擇的資料(即RADIO,CHECKBOX,OPTION中 的VALUE值)。 並且Web瀏覽器將使用者資料中的所有空格都替換成"+"號。另外一些特殊字元的表示使用轉義 符"%"後面加上該特殊字元的十六進位制ASCII碼。特殊字元主要包括"="、"+"、"&"、"%"以及多 行文字中的回車,換行符,所有不能直接顯示的高位ASCII符等。

  一個Form的簡單例子 例如在上例中使用者填入了下述資訊(其中/n表示回車換行): name "J&K" sex "male" flavor "apple" flavor "orange" weight "middle" opinion "I think it is necessary that/nman eat fruit everyday." 則Web瀏覽器傳送資料時的字元序列為: name=J%26K&sex=male&flavor=apple&flavor=orange&weight=middle& opinion=I+think+it+is+necessary+that%0D%0Aman+eat+fruit+everyday. 用CGI程式處理得到的資料 當Web瀏覽器將Form資料經過編碼後,就傳送給了Web伺服器,而Web伺服器並非自己處理這些 資料,而是先依靠CGI程式來幫忙處理這些資料,然後Web伺服器再把CGI程式產生的處理結果 返回給Web瀏覽器。

    CGI(Common Gateway Interface,通用閘道器介面)是資訊伺服器(如Web服 務器)與外部應用程式之間的一個介面標準。通常被Web伺服器所取到的HTML檔案總是事先編 輯好的,固定不變的資訊,但若通過實時執行著的CGI程式Web伺服器就有可能向Web瀏覽器 輸出動態的資訊。 CGI標準用最簡單的話來說就是:CGI程式是通過標準輸入(stdin)或環境變數來得到伺服器的輸 入資訊,並通過標準輸出(stdout)向伺服器輸出資訊。 當Web伺服器收到了由Web瀏覽器傳來的Form資料時,就啟動標記中ACTION屬性所指 明的CGI程式。如果METHOD屬性值是GET,CGI程式就從環境變數QUERY_STRING中獲取Form數 據;若METHOD屬性值是POST,CGI程式就從標準輸入(stdin)中獲取Form資料。 CGI程式獲取Form資料並經過處理後,還要向Web伺服器返回一定的資訊(如資料的處理結果等 )。為讓Web伺服器能正確理解所返回的是何種資訊,CGI規定在輸出的資訊體前加上一個頭部 資訊,該頭部資訊由若干行ASCII文字構成,並用一個空行將頭部資訊與資訊體隔開。

    例如要返 回HTML文件則頭部資訊為"Content-type: text/html"。 下面給出一個用C語言編寫的CGI程式的基本框架:

[cpp] view plain copy  print?
  1. #include   <stdio.h>
  2. #include   <stdlib.h>
  3. #include   <string.h>
  4. char InputBuffer[4096];  
  5. int DecodeAndProcessData(char *input);    /*具體譯碼和處理資料,該函式程式碼略*/
  6. int main(int argc, char*argv[])  
  7. {  
  8.         int   ContentLength;   /*資料長度*/
  9.         int   x;  
  10.         int   i;  
  11.         char   *p;  
  12.         char   *pRequestMethod;     /*   METHOD屬性值   */
  13.         setvbuf(stdin,NULL,_IONBF,0);     /*關閉stdin的緩衝*/
  14.         printf("Content-type:text/html\n\n");     /*從stdout中輸出,告訴Web伺服器返回的資訊型別*/
  15.         printf("\n");                                           /*插入一個空行,結束頭部資訊*/
  16.         printf("<p>hello test</p>");  
  17.         /*   從環境變數REQUEST_METHOD中得到METHOD屬性值   */
  18.         pRequestMethod = getenv("REQUEST_METHOD");  
  19.         if(pRequestMethod==NULL)  
  20.         {  
  21.                 printf("<p>request = null</p>");  
  22.                 return   0;  
  23.         }  
  24.         if (strcasecmp(pRequestMethod,"POST")==0)  
  25.         {  
  26.                 printf("<p>OK the method is POST!\n</p>");  
  27.                 p = getenv("CONTENT_LENGTH");     //從環境變數CONTENT_LENGTH中得到資料長度    
  28.                 if (p!=NULL)  
  29.                 {  
  30.                         ContentLength = atoi(p);  
  31.                 }  
  32.                 else
  33.                 {  
  34.                         ContentLength = 0;  
  35.                 }  
  36.                 if (ContentLength > sizeof(InputBuffer)-1)   {  
  37.                         ContentLength = sizeof (InputBuffer) - 1;  
  38.                 }  
  39.                 i   =   0;  
  40.                 while (i < ContentLength)  
  41.                 {                         //從stdin中得到Form資料    
  42.                         x  = fgetc(stdin);  
  43.                         if (x==EOF)  
  44.                                 break;  
  45.                         InputBuffer[i++] = x;  
  46.                 }  
  47.                 InputBuffer[i] = '\0';  
  48.                 ContentLength   =   i;  
  49.                 DecodeAndProcessData(InputBuffer);                 //具體譯碼和處理資料,該函式程式碼略    
  50.         }  
  51.         elseif (strcasecmp(pRequestMethod,"GET")==0)  
  52.         {  
  53.                 printf("<p>OK the method is GET!\n</p>");  
  54.                 p = getenv("QUERY_STRING");     //從環境變數QUERY_STRING中得到Form資料    
  55.                 if   (p!=NULL)  
  56.                 {  
  57.                         strncpy(InputBuffer,p,sizeof(InputBuffer));  
  58.                         DecodeAndProcessData(InputBuffer);    //具體譯碼和處理資料,該函式程式碼略    
  59.                 }  
  60.         }  
  61.         printf("<HEAD><TITLE>Submitted OK</TITLE></HEAD>\n");//從stdout中輸出返回資訊    
  62.         printf("<BODY>The information you supplied has been accepted.</BODY>\n");  
  63.         return   0;  
  64. }  
  65. int DecodeAndProcessData(char *input)    //具體譯碼和處理資料   
  66. {  
  67.         // 補充具體操作
  68.         return 0;  
  69. }  

相關推薦

CGI程式POSTGET訊息處理

 資料傳送格式 當用戶填完表格並按了SUBMIT按鈕後,Web瀏覽器並非將使用者所填的資料直接送給Web伺服器, 而先要經過一定的編碼處理。 Web瀏覽器總是將資料按照“變數名=變數值”這樣的資料對格式進行編碼,並且每對資料之間 用一個&符號相連線。其中“變數名”

AJAX - Http post get 的區別

安全 ext tex 不同方法 per 信息 行修改 進行 TE HTTP: post 和 get 是 HTTP 協議中的兩種方法。瀏覽器和服務器的交互是通過 HTTP 協議執行的,他的全稱為Hyper Text Transfer Protocol(超文本傳輸協議)。HTT

HTTPpostget傳參的區別

 插一下別的知識:HTTP的請求方式 HTTP一共有8中請求方式:1.OPTIONS    2.HEAD    3.GET    4.POST    5.PUT    6.DELETE  

Jmeterpostget請求的區別(五)

POST和GET的區別 1、原理不同: 一般我們在瀏覽器輸入一個網址訪問網站都是GET請求;post請求引數放在body data中。get多少次都不會改變頁面呈現的資料,post會。 2、資料量 GET傳送的資料量較小,不能大於2KB。POST傳送的資料量較大,一般預設為不受

ApacheHttpClientpostget的請求

ApachehttpClient是谷歌官方的http請求,Eclipse自帶有,但是AS好像沒有(還是我的AS版本問題)。它比httpURLConnection請求更簡單。 post請求相對get就是引數有變化 public class MainActi

springmvcPostget亂碼的解決

第一種方法依賴於tomcate6中webapps\examples\WEB-INF\classes\filters下SetCharacterEncodingFilter這個類 實現方法在web.xml 中新增以下程式碼 <filter>   <filter

Androidpostget的提交方式【三種】

向伺服器提交資料有兩種方式,post和get。兩者的區別主要有三點,安全性、長度限制、資料結構。其中get請求安全性相比較而言較差,資料長度受瀏覽器位址列限制,沒有方法體。兩種都是較為重要的資料提交方式。現簡單介紹一下三種post和get的提交方式。無論是哪種方法實現post和get,get 的訪問路徑都

淺析HTTPPOSTGET區別並用Python模擬其響應請求

    最近在幾周在做手遊崩潰資訊收集和上傳,拿到崩潰資訊後,使用的是HTTP的POST方法上傳到公司共用的伺服器的,因此做簡單總結。本文首先簡單介紹了HTTP協議,主要說明了POST方法和GET方法的區別;然後用Python實現了 對POST方法和GET方法的響應;最後用

httppostget的區別

GET和POST是HTTP協議中的兩種傳送請求的方法。HTTP是基於TCP/IP的關於資料如何在全球資訊網中如何通訊的協議。所以GET和POST的底層都是TCP/IP,也就是說,GET/POST都是TC

JSP 處理 POSTGET請求

例如 enc utf get post character 頁面 odi .get JSP頁面接受post請求,如果請求的參數值裏包含非西歐字符,首先需要調用 request.setCharacterEncoding("UTF-8"); 如果是GET請求,不能這樣做,可先獲

C++使用libcurl做HttpClient(業務觀摩,用C++封裝過程式代碼,postget的數據,最好url編碼,否則+會變成空格)good

com 如果 msvc 是否 out tle source rac 無需 當使用C++做HTTP客戶端時,目前通用的做法就是使用libcurl。其官方網站的地址是http://curl.haxx.se/,該網站主要提供了Curl和libcurl。Curl是命令行

CGI編程POSTGET詳解

cgi編程中post、get詳解什麽是 HTTP?超文本傳輸協議(HTTP)的設計目的是保證客戶機與服務器之間的通信。HTTP 的工作方式是客戶機與服務器之間的請求-應答協議。web 瀏覽器可能是客戶端,而計算機上的網絡應用程序也可能作為服務器端。舉例:客戶端(瀏覽器)向服務器提交 HTTP 請求;服務器向客

AndroidHTTP PostGet請求

簡單的隨手記,適合初學者使用,現在網路請求比較流行使用OKHttp,後期部落格會寫到如何使用。 在AndroidManifest加入以下許可權 <uses-permission android:name="android.permission.INTERNET" />

Post get 請求亂碼問題處理

原始處理get post 請求亂碼 String newEncoding = new String( params.getBytes("iso-8859-1") , "utf-8" );  原理分析   post 處理亂碼方式 req.setCharac

PHP專案使用Guzzle執行POSTGET請求

以往在專案中要用到第三方介面時會用到封裝好的curl執行請求,現在有了更好的解決方案——Guzzle。 下面是官方介紹: Guzzle是一個PHP的HTTP客戶端,用來輕而易舉地傳送請求,並整合到我們的WEB服務上。 介面簡單:構建查詢語句、POST請求、分流

防止通過POSTGET方法SQL注入的兩個最徹底過濾程式

先針對POST遞交上來的資訊過濾程式 Public Function filterStr(str)    str=replace(str,CHR(59),";") '“;”    str=replace(str,CHR(38),"&") '“&”  

HttpClient PostGet請求例項+ 中文引數處理

  import java.io.IOException;    import java.net.URLEncoder;        import org.apache.commons.httpclient.HttpClient;    import org.apache.commons.httpclie

淺談 POST GET 在 Web的應用

  Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,

php通過postget傳遞陣列的方法

1.php中通過post方式傳遞陣列 將input中的name屬性寫為xx[]形式。 eg <form action="" > <input type="text" name="myname[]"> <input type="text" na

C++MFC程式設計筆記day01 MFC介紹、建立MFC程式重寫訊息處理

一、MFC概念和作用 1、全稱Microsoft Foundation Class Library,我們稱為微軟基礎類庫,封閉了絕大部分的win32 Api函式,C++語法中的資料結構,程式的執行流程MFC就是一個庫(動態庫,靜態庫)MFC還是一個程式框架 2、為什麼使用M