Linux之CGI编程小结

一、CGI标准输入、环境变量、标准输出

1、标准输入
  CGI程序的标准输入是与Web服务器的标准输出对应的,看起来就像其他可执行程序一样通过标准输入(stdin)得到输入信息,实则这些数据是由浏览器传递给服务器后再由服务器定向到CGI的输入中的,如Form表单中的数据,这就是所谓的Web浏览器通过Web服务器与CGI后台可执行程序进行信息交互的方法。这也意味着在操作系统命令行状态可执行CGI程序,对CGI程序进行调试。对于CGI来说数据传输方法分为POST和GET方法。

2、环境变量

操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了自己的一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法就是通过环境变量QUERY-STRING向CGI程序传递Form中的数据的。

下面是CGI程序设计中用得比较频繁的一些环境变量:
  HTTP-REFERER:调用该CGI程序的网页的URL。
  REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名。
  REQUEST-METHOD:指的是当Web服务器传递数据给CGI程序时所采用的方法,分为GETPOST两种方法。GET方法仅通过环境变量 (如QUERY-STRING)传递数据给CGI程序,而POST方法通过环境变量和标准输入传递数据给CGI程序,因此POST方法可较方便地传递较多的数据给CGI程序。

SCRIPT-NAME:该CGI程序的名称。

QUERY-STRING:当使用GET方法时,Form中的数据最后放在QUERY-STRING中,传递给CGI程序。

CONTENT-TYPE:传递给CGI程序的数据的MIME类型(必不可少的头信息),通常为″application/x-www-form-urlencodede″,它是从HTML Form中以POST方法传递数据给CGI程序的数据编码类型,称为URL编码类型。
  CONTENT-LENGTH:传递给CGI程序的数据字符个数(字节)。Web服务器在调用使用POST方法的CGI程序时设置此环境变量,它的文本值表示Web 服务器传送给CGI程序的输入中的字符数目,因此我们使用函数atoi() 将此环境变量的值转换成整数,并赋给变量n。请注意Web服务器并不以文件结束符来终止它的输出,所以如果不检查譔环境变量,CGI程序就无法知道什么时候输入结束。

  在C语言程序中,要访向环境变量,可使用getenv()库函数。

例如:
         if (getenv (″CONTENT-LENGTH″))
              n=atoi(getenv (″CONTENT-LENGTH″));
  请注意程序中最好调用两次getenv():第一次检查该环境变量是否存在,第二次再使用该环境变量。这是因为函数getenv()在给定的环境变量名不存在时,返回一个NULL(空)指针,如果你不首先检查而直接引用它,当该环境变量不存在时会引起CGI程序崩溃。

3、标准输出
  CGI程序通过标准输出(stdout)将输出信息传送给Web服务器,CGI的标准输出对应的是Web服务器的标准输入。传送给Web服务器的信息可以用各种格式,通常是以纯文本或者HTML文本的形式,这样我们就可以在命令行状态调试CGI程序,并且得到它们的输出。

CGI程序产生的输出由两部分组成:MIME头信息和实际的信息。两部分之间以一个空行分开。请注意任何MIME头信息后必须有一个空行

如:prinft (″Content type :text/plain%d%d″,10, 10);
  此行通过标准输出将字符串[″Contenttype :text/plain%d%d″, 10, 10]传送给Web服务器。它是一个MIME头信息,它告诉Web服务器随后的输出是以纯ASCII文本的形式。请注意在这个头信息中有两个换行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。

一旦发送这个MIME头信息给Web服务器后,Web浏览器将认为随后的文本输出为HTML源代码,在HTML源代码中可以使用任何HTML结构,如超链、图像、Form,及对其他CGI程序的调用。也就是说,我们可以在CGI程序中动态产生HTML源代码。

简单实例参考:http://download.csdn.net/detail/zqj6893/5584559

二、CGI程序数据处理的一般工作流程。

1.通过检查环境变量REQUEST-METHOD确定客户端所使用的数据传递方法,POST还是GET方法。
  2.通过检查环境变量CONTENT-LENGTH,确定有多少输入;
  3.从相应环境变量中或标准输入中得到所有的用户数据;
  4.以相应的方法处理输入数据,如解码用户数据以提取所需信息、保存数据以更新配置文件等等;
  5.通过″Contenttype:″头信息,将输出信息的格式告诉Web服务器;
  6.通过使用printf()或者putchar()或者其他的文件写函数,将输出传送给Web服务器。
  CGI程序的主要任务就是从Web服务器得到输入信息,进行处理,然后将输出结果再送回给Web服务器。

三、CGI中From表单数据的分析和解码
  当用户提交一个HTMLForm时,Web浏览器首先对Form中的数据以名字/值对的形式进行编码,并发送给Web服务器,然后由Web服务器传递给CGI程序。

URL编码规则:每对name/value由&符分开;每对来自表单的name/value由“=”符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =、&、% 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。编码后数据格式如下:
  name1=value1&name2=value2&name3=value3&name4=value4&...
  其中name是Form中定义的INPUT、SELECT或TEXTAREA等标置(Tag)名字,value是用户输入或选择的设置值。程序中需要对编码后的数据进行分析和解码。要分析这种数据流,CGI程序必须首先将数据流分解成一组组的名字/值对。这可以通过在输入流中查找下面的两个字符来完成:
  每当找到字符“=”,标志着一个Form变量名字的结束;每当找到字符“&”,标志着一个Form变量值的结束。请注意输入数据的最后一个变量的值不以“&”结束。
  一旦“名字/值对”分解后,还必须将输入中的一些特殊字符转换成相应的ASCII字符。这些特殊字符是:
  +:将“+”转换成空格符;
  %xx:用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相应的ASCII字符。


你可能感兴趣的:(linux,cgi,POST与GET方法,C语言cgi实例)