二、CGI设计初步

1. CGI数据传送方法
    客户有两种方法:
      ⑴通过环境变量,采用GET方式:<form method="GBT" action="/cgi-bin/mycgi">…</form>
    该法简单,但用cethod=get方式通过变量传送数据会因变量接受的数据量有限而产生数据丢失。
      ⑵通过标准输入,采用POST方式──建议使用方式
    标准输入法是通过method=post方式把数据传送到网关程序的入口。数据在传输中是经过URL编码的,CGI程序在处理前需进行解码,由于此法对数据量没有限制,因而传输中不会产生数据丢失。
    URL编码就是浏览器把表单输入的数据传送到服务器时,将输入数据编码、打包。从表单输入的变量及其数值,被编码为“参数名/参数值”,同时把那此不能直 接传输的数据转化为16进制。然后根据使用的是GET方法还是POST方法,把它作为URL的一部分或直接送到服务器。
    CGI程序是一种在www服务器上运行的程序,主要用于处理用户通过表单输入的信息,在服务器上产生相应的作用,或把处理结果反馈给浏览器,CGI程序须符合以下两个条件:
      ⑴CGI程序的输出要写标准输出
    这样,服务器才能解释这一输出,并把它返回到浏览器。
      ⑵CGI程序的数据头要告诉服务器如何处理该程序的输出
    为了使服务器能够解释CGI程序的输出,CGI程序要有一个特殊的头作为第一个输出行,数据头可以是下列三种之一:
    ①数据类型(Content-type), 如:Content-type: text/html
    ②地址类型(Location), 如:Location://www.w3.0rg
    ③状态类型(Status), 如:Status:204 No Respouse
    CGI程序同下列三部分构成:
      ⑴数据解码部分:由浏览器传送给服务器的通过表单输入的数据都是经过URL编码的,必须进行解码。如果不需要处理表单输入,该部分可省略。
      ⑵数据头部分:必须包含这一部分作为第一个输出行,该行后必须有一空格行。该行可以是下列三种之一:
    ① 数据类型(Content-type), 如:Content-type: text/html
    ②地址类型(Location), 如:Location:// www.w3.org
    ③状态类型(Status), 如:Status:204 No Respouse
      ⑶CGI程序主体部分:对通过表单输入的数据进行处理,并输出到标准输出。
    若服务器要把数据传送给浏览器,则须在CGI程序中使用表示数据类型的头,它将告诉浏览器如何解释该输入。
    例1: 如服务器要判断回一个HTML文件,则CGI程序中的类型头应定义为:Content-type:text/html
    例2: 如服务器要送回的文件类型是JEPG文件,则CGI程序中的类型头应定义为:Contert-type:p_w_picpath/jpg
其余的数据以此类推。
    若用户想在服务器上打开或加载一个现有的文件,则须在CGI程序中使用表示地址类型的头。表示地址类型的头的值可以是一个URL全地址,也可以是去掉http:和主机名的URL地址。
    例1: Location:   http://www.lne.com/index.html
    例2: Location:   http://www.w3.org/
    例3: Location:   http://lemay/the  Book/index.html
    如果在传送最后服务器还要送一个特殊的状态码到浏览器,则须在CGI程序中加入表示状态类型的头。状态码由HTTP定义。

    例:Status: 204 No Response
    此状态码表示这时浏览器不能从服务器得到任何反馈信息,即服务器上的CGI程序只是对输入进行处理而不作应答,浏览器界面保持不变。
    下面是一个检索约翰是否登录的例子:
#!/bin/sh 数据头部分,声明数据格式
echo"Content-type:text/html" 为文本格式
echo 此处省略了解码部分

echo"<HTML><HEAD>"
echo"<TITLE>约翰登录了吗?</TITLE>"
echo"</HDAD><BODY>"  
ison='who I grep lemay' 查询登录信自己 ,
if[-z"Sison:]; 并向标准输出设备
then echo"<P>约翰登录"。 输出查询到的信息。
elso echo"<P>约翰未登录"。
fi
echo "</BODT></HTML>"