CGI技术简单介绍

1.客户端传输数据的获取
    原理:当服务端守护进程接收到客户端用户代理(如浏览器)提交的CGI请求时,所创建的CGI子进程会设置与CGI请求内容有关的环境变量,并建立服务器与外部CGI程序之间通讯的通道(即标准I/O)。CGI程序可以通过环境变量,标准I/O或命令行参数获取客户端用户输入的数据。数据的获取与请求所采用的HTTP方法(Method)和用户所使用的请求方式有关。
    ●获取环境变量
    环境变量的类别很多,包含客户端和服务端的详细信息。在一般CGI程序开发中,下述几个环境变量在数据传递中起着重要作用。
    *GATEWAY-INTERFACE
    CGI程序所使用的CGI标准接口的版本号。如使用的CGI1.1版,该变量表示为“CGI/1.1”
    *REQUEST-METHOD
    HTTP请求方法。根据该变量值可判断CGI请求所采用的请求方法,以决定是通过Stdin还是通过环境变量QUERY-STRING获取客户端传输数据。
    *QUERY-STRING
    QUERY-STRING是CGI程序URL中″?″之后的数据。当使用ISINDEX查询或FORM表使用GET方法时,客户端传输数据可以通过读取该变量而获得。
    *CONTENT-LENGTH
    CONTENT-LENGTH表示客户端传输数据的字节数。
    *CONTENT-TYPE
    CONTENT-TYPE表示客户端传输数据的数据编码类型。
    利用-environ(int)函数可以获得所有的环境变量及其值;利用getenv(constchar*)函数可以获得指定环境变量的相应值。
    ●HTTP请求方法
    客户端用户代理提交的CGI请求是HTTP请求,其中包括HTTP请求方法。HTTP协议定义的请求方法中常用的主要有GET和POST。客户端FORM表的METHOD属性用来设置请求方法,其缺省值为GET。
    如果在FORM中使用GET方法,CGI程序通过环境变量QUERY-STRING获取客户端传输数据。
    如果在FORM中使用POST方法,CGI程序通过通过CONTENT-LENGTH获取客户端传输数据的字节数,通过Stdin读取客户端传输数据。
    2.有效数据的提取和处理
    通过上述方式获取的客户端传输数据的一般格式为:
    name[1]=value[1]&name[2]=value[2]&...name[i]=value[i]...name[n]=value[n]
    (1Ι=iΙ=n)
    其中name[i]表示变量名,它是在FORM表中某输入域的名字;value[i]表示变量值,它是用户在FORM表中某输入域中输入的值。
    客户端传输数据的每对″Name=Value″串由′&′字符分隔,其数据编码类型可以从环境变量CONTENT-TYPE获取。CGI/1.1版仅支持“application/x-www-form-urlencoded”编码方式。这种编码方式和URL的编码方式一样,遵循两个规则:数据中的空格(ASCII码值32)编码成'+'号;保留字符编码成″%XX″形式,″XX″是该字符ASCII值的十六进制表示,比如″$″的编码为″%24″,″?″的编码为″%3F″。
    因此,要获取客户端用户的输入数据,必须对上述获取的数据进行分离和解码等处理。利用函数strtok()、strchr()等可以实现数据分离处理,而数据的解码则需要对整个数据串进行扫描,将数据串中的″%XX″复原为对应的ASCII码。
    在提取到有效数据后,还可能进行许多其他的处理,如数据库查询等。这种处理与普通编程相同。
    3.向客户端返回应答
    CGI程序处理结束后,通过标准输出流将应答信息传递给服务器,再由服务器返回给发出请求的客户端。其输出的应答信息是HTTP应答消息,它一般由两部分组成:应答头和应答数据。
    常见的应答头包括三种头域:Content-Type(数据编码类型,用MIME类型表示),Location(特定文档的URL,这种情况不直接向客户端输出内容而输出该URL)和Status(处理结果的状态码和状态描述)。HTTP应答头由几行格式相同的文本构成,每行的基本格式为:″头域名:该域内容″。应答头和应答体之间用一空行加LF(或CR/LF)分隔。应答体为CGI扩展程序的输出数据,其数据类型应该与Content-Type值相一致。
    CGI程序的输出可以用printf()、puts()等标准I/O函数来实现。
    4.CGI程序的开发及其一般流程
    在开发CGI程序过程中,可根据实际情况(服务器提供的接口、实际需求和程序员经验等)选择编程语言,如C/C++,Perl,TCL,AnyUnixshell,VB,AppleScript。如果选用C/C++等语言,必须编译成可执行文件;如果选用Perl等解释语言,服务器必须安装相应的解释器。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值