欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在CGI程序中POST和GET消息的处理

程序员文章站 2022-03-02 23:04:20
...

  数据传送格式 当用户填完表格并按了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程序的基本框架:

  1. #include   <stdio.h>  
  2. #include   <stdlib.h>  
  3. #include   <string.h>  
  4. char InputBuffer[4096];  
  5.   
  6. int DecodeAndProcessData(char input);    /具体译码和处理数据,该函数代码略/  
  7.   
  8. int main(int argc, char*argv[])  
  9. {  
  10.         int   ContentLength;   /数据长度/  
  11.         int   x;  
  12.         int   i;  
  13.         char   *p;  
  14.         char   *pRequestMethod;     /   METHOD属性值   /  
  15.         setvbuf(stdin,NULL,_IONBF,0);     /关闭stdin的缓冲/  
  16.         printf(”Content-type:text/html\n\n”);     /从stdout中输出,告诉Web服务器返回的信息类型/  
  17.         printf(”\n”);                                           /插入一个空行,结束头部信息/  
  18.         printf(”<p>hello test</p>”);  
  19.         /   从环境变量REQUEST_METHOD中得到METHOD属性值   */  
  20.   
  21.         pRequestMethod = getenv(”REQUEST_METHOD”);  
  22.         if(pRequestMethod==NULL)  
  23.         {  
  24.                 printf(”<p>request = null</p>”);  
  25.                 return   0;  
  26.         }  
  27.         if (strcasecmp(pRequestMethod,“POST”)==0)  
  28.         {  
  29.                 printf(”<p>OK the method is POST!\n</p>”);  
  30.                 p = getenv(”CONTENT_LENGTH”);     //从环境变量CONTENT_LENGTH中得到数据长度      
  31.                 if (p!=NULL)  
  32.                 {  
  33.                         ContentLength = atoi(p);  
  34.                 }  
  35.                 else  
  36.                 {  
  37.                         ContentLength = 0;  
  38.                 }  
  39.                 if (ContentLength > sizeof(InputBuffer)-1)   {  
  40.                         ContentLength = sizeof (InputBuffer) - 1;  
  41.                 }  
  42.   
  43.                 i   =   0;  
  44.                 while (i < ContentLength)  
  45.                 {                         //从stdin中得到Form数据      
  46.                         x  = fgetc(stdin);  
  47.                         if (x==EOF)  
  48.                                 break;  
  49.                         InputBuffer[i++] = x;  
  50.                 }  
  51.                 InputBuffer[i] = ’\0’;  
  52.                 ContentLength   =   i;  
  53.                 DecodeAndProcessData(InputBuffer);                 //具体译码和处理数据,该函数代码略      
  54.         }  
  55.         else if (strcasecmp(pRequestMethod,“GET”)==0)  
  56.         {  
  57.                 printf(”<p>OK the method is GET!\n</p>”);  
  58.                 p = getenv(”QUERY_STRING”);     //从环境变量QUERY_STRING中得到Form数据      
  59.                 if   (p!=NULL)  
  60.                 {  
  61.                         strncpy(InputBuffer,p,sizeof(InputBuffer));  
  62.                         DecodeAndProcessData(InputBuffer);    //具体译码和处理数据,该函数代码略      
  63.                 }  
  64.         }  
  65.         printf(”<HEAD><TITLE>Submitted OK</TITLE></HEAD>\n”);//从stdout中输出返回信息      
  66.         printf(”<BODY>The information you supplied has been accepted.</BODY>\n”);  
  67.   
  68.         return   0;  
  69. }  
  70.   
  71.   
  72. int DecodeAndProcessData(char *input)    //具体译码和处理数据     
  73. {  
  74.         // 补充具体操作  
  75.         return 0;  
  76. }  
#include   <stdio.h>

include <stdlib.h>

include <string.h>

char InputBuffer[4096];

int DecodeAndProcessData(char input); /具体译码和处理数据,该函数代码略*/

int main(int argc, char*argv[])
{
int ContentLength; /数据长度/
int x;
int i;
char *p;
char pRequestMethod; / METHOD属性值 */
setvbuf(stdin,NULL,_IONBF,0); /关闭stdin的缓冲/
printf("Content-type:text/html\n\n"); /从stdout中输出,告诉Web服务器返回的信息类型/
printf("\n"); /插入一个空行,结束头部信息/
printf("<p>hello test</p>");
/* 从环境变量REQUEST_METHOD中得到METHOD属性值 */

    pRequestMethod = getenv("REQUEST_METHOD");
    if(pRequestMethod==NULL)
    {
            printf("&lt;p&gt;request = null&lt;/p&gt;");
            return   0;
    }
    if (strcasecmp(pRequestMethod,"POST")==0)
    {
            printf("&lt;p&gt;OK the method is POST!\n&lt;/p&gt;");
            p = getenv("CONTENT_LENGTH");     //从环境变量CONTENT_LENGTH中得到数据长度    
            if (p!=NULL)
            {
                    ContentLength = atoi(p);
            }
            else
            {
                    ContentLength = 0;
            }
            if (ContentLength &gt; sizeof(InputBuffer)-1)   {
                    ContentLength = sizeof (InputBuffer) - 1;
            }

            i   =   0;
            while (i &lt; ContentLength)
            {                         //从stdin中得到Form数据    
                    x  = fgetc(stdin);
                    if (x==EOF)
                            break;
                    InputBuffer[i++] = x;
            }
            InputBuffer[i] = '\0';
            ContentLength   =   i;
            DecodeAndProcessData(InputBuffer);                 //具体译码和处理数据,该函数代码略    
    }
    else if (strcasecmp(pRequestMethod,"GET")==0)
    {
            printf("&lt;p&gt;OK the method is GET!\n&lt;/p&gt;");
            p = getenv("QUERY_STRING");     //从环境变量QUERY_STRING中得到Form数据    
            if   (p!=NULL)
            {
                    strncpy(InputBuffer,p,sizeof(InputBuffer));
                    DecodeAndProcessData(InputBuffer);    //具体译码和处理数据,该函数代码略    
            }
    }
    printf("&lt;HEAD&gt;&lt;TITLE&gt;Submitted OK&lt;/TITLE&gt;&lt;/HEAD&gt;\n");//从stdout中输出返回信息    
    printf("&lt;BODY&gt;The information you supplied has been accepted.&lt;/BODY&gt;\n");

    return   0;

}

int DecodeAndProcessData(char *input) //具体译码和处理数据
{
// 补充具体操作
return 0;
}





相关标签: web服务器