CGI以及CGIC那点事儿

CGI介绍(了解)

早期的Web服务器,只能响应浏览器发来的HTTP静态资源的请求,并将存储在服务器中的静态资源返回给浏览器。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。简单理解,可以认为CGI是Web服务器和运行其上的应用程序进行“交流”的一种约定。
在这里插入图片描述

CGI是Web服务器和一个独立的进程之间的协议,它会把HTTP请求Request的Header头设置成进程的环境变量,HTTP请求的Body正文设置成进程的标准输入,进程的标准输出设置为HTTP响应Response,包含Header头和Body正文。

在这里插入图片描述

CGI功能

A、分析数据,并自动校正一些有缺陷的浏览器发来的数据

B、透明接收用GET或 POST方法发来的From数据

C、能接受上传文件

D、能够设置和接收cookies

E、用一致的方式处理From元素里的回车

F、提供字符串,整数,浮点数,单选或多选功能来接收数据

G、提供数字字段的边界检查

H、能够将CGI环境变量转化成C中的非空字符串

I、 提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态

BOA与CGI工作机制

HTTP协议是WWW的基础,基于客户/服务器模型,服务器可以为分布在网络中的客户提供服务。HTTP是建立在TCP/IP协议之上的“无连接”协议,每次连接只处理一个请求。在BOA服务器上,运行产着一个守护进程对端口进行监听,等待来自客户的请求。当一个请求到来时,将创建一个子进程为用户的连接服务。根据请求的不同,服务器返回HTML文件或者通过CGI调用外部应用程序,返回处理结果。服务器通过CGI与外部程序和脚本之间进行交互,根据客户端在进行请求时所采取的方法,服务器会收集客户所提供的信息,并将该部分信息发送给指定的CGI扩展程序。CGI扩展程序进行信息处理并将结果返回服务器,然后服务器 对信息进行分析,并将结果发送回客户端。

外部CGI程序与BOA服务器进行通信、传递有关参数和处理结果是通过环境变量、命令行参数和标准输入来进行的。服务器提供了客户端(浏览器)与CGI扩展程序之间的信息交换的通道。CGI的标准输入是服务器的标准输出,而CGI的标准输出是服务器的标准输入。客户的请求通过服务器的标准输出传送给CGI的标准输入,CGI对信息进行处理后,将结果发送到它的标准输入,然后由服务器将处理结果发送给客户端。

CGI程序(明确)

通过CGI接口,Web服务器就能够获取客户端传递的数据,并转交给服务器端的CGI程序处理,然后返回结果给客户端。简单来说,CGI实际上是一个接口标准。而通常所说的CGI指代其实是CGI程序,也就是实现了CGI接口标准的程序,只要编程语言具有标准输入、标准输出和环境变量,就可以用来编写CGI程序。

CGI程序通过标准输入(STDIN)和标准输出(STDOUT)进行数据的输入输出,此外CGI程序还通过环境变量来得到输入,操作系统提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。Web服务器和CGI接口又另外设置了一些环境变量,用来向CGI程序传递一些重要的参数。CGI的GET方法还通过环境变量QUERY_STRING向CGI程序传递Form表单中的数据。

CGI的通讯方式

当有数据从客户端浏览器传到Web服务器后,web服务器会根据传送的类型(基本有二类:GET/POST),将接收到的数据传入 QUERY_STRING或变量中, CGI程序可以通过标准输入,在程序中接收web服务器接收的数据。当要向浏览器发送信息时,只要向Web服务器发送特定的文件头信息,即可通过标准输出将信息发往Web 服务器, Web服务器处理完由CGI程序发来的信息后就会将信息发送给浏览器。

浏览器请求数据的获取:

用GET方式接收到的数据保存在Web服务器的QUERY_STRING 变量里,而通过POST方式接收到的数据是保存在Web服务器变量里。两种数据接收方式的区别是:以GET方式接收的数据是有长度限制,而用POST方式接收的数据是没有长度限制的;以GET方式发送数据,可以通过URL的形式来发送,但POST方式发送的数据必须要通过Form才到发送。

CGIC(掌握)

CGIC是一个功能比较强大的支持CGI开发的标准C库,并且支持Linux、Unix和Windows等多种操作系统。

CGIC变量

char *cgiServerSoftware

服务器软件名称,或者一个空的字符串

char *cgiServerName

返回服务器名称或空

char *cgiGatewayInterface

网关接口(通常是 CGI/1.1)或空

char *cgiServerProtocol

网络协议(usually HTTP/1.0)或空

char *cgiServerPort

服务器端口(usually 80),或空

char *cgiRequestMethod

请求方式(usually GET or POST)或空

char *cgiPathInfo

指出附加虚拟路径

char *cgiPathTranslated

指出附加虚拟路径并由服务器转为本地路径

char *cgiscriptName

调用程序的名字

char *cgiQueryString

包含GET-method请求或者 标签。不需解析,除非用标签,通常由CGIC函数库自动解析。

char *cgiRemoteHost

从浏览器返回客户主机的名字

char *cgiRemoteAddr

从浏览器返回客户的IP地址

char *cgiAuthType

返回用户授权信息

char *cgiRemoteUser

鉴别用户cgiAuthType.

char *cgiRemoteIdent

返回用户的名字(用户通过用户坚定协议)

char *cgiContentType

返回MIME内型

char *cgiAccept

参考 cgiHeaderContentType() cgiUserAgent

char *cgiUserAgent

获取的用户浏览器信息

char *cgiReferrer

指向用户访问的URL.

int cgiContentLength

表单或查询数据的字节被认为是标准的.

FILE *cgiOut

CGI输出。cgiHeader函数,象cgiHeaderContentType,首先被用于输出mime头;用于 fprintf() 和fwrite()。cgiOut通常相当于stdout。

FILE *cgiIn

CGI输入

CGIC主要函数

用一般 ANSI C或C++编译器就可以编译CGIC程序 , 与C程序不同的是,用CGIC写的源码其主函数是cgiMain(), 而不是通常的main。 CGIC的函数库会自动把cgiMain连接到相应的main上。

CGIC库主要函数说明:

  • cgiHeaderContentType

在任何向浏览器输出之前被调用 ,否则将出错或浏览器不能识别。

  • cgiFormResultType cgiFormString( char *name, char *result, int max)

用于从输入域中copy字符串。将域名max-1字节中的字符copy到缓冲区result。若域不存在,则copy一个空串到result缓冲区。在此函数中所有的新行由换行符代表。

  • cgiFormResultType cgiFormStringNoNewlines( char *name, char *result, int max)

与cgiFormString函数相似,只是所有的CR和LF都被去掉。

  • cgiFormResultType cgiFormStringSpaceNeeded( char *name, int *length)

返回指向name的字符串的长度,并将长度放入length中。

  • cgiFormResultType cgiFormStringMultiple( char *name, char ***ptrToStringArray)

若同一名字有多个输入域,或域中的字符串可以动态变化,使用本函数。它把名为name的所有输入域的值放在prtToStringArray中。

  • void cgiStringArrayFree(char **stringArray)

释放了分配给stringArray的内存。

  • cgiFormResultType cgiFormInteger( char *name, int *result, int defaultV)

从输入域中取出整数放入result中。

  • cgiFormResultType cgiFormIntegerBounded( char *name, int *result, int min, int max, int defaultV)

若输入域中的整数在界限内则取出并放入result中。

cgiFormResultType cgiFormDouble( char *name, double *result, double defaultV)

从输入域中取出浮点数放入result中。

  • cgiFormResultType cgiFormDoubleBounded( char *name, double *result, double min, double max, double defaultV)

若输入域中的浮点数在界限内则取出并放入result中。

  • cgiFormResultType cgiFormSelectSingle( char *name, char **choicesText, int choicesTotal, int *result, int defaultV)

取出复选框(跟在select语句之后的),把选择的名字copy到choicesText,把选择的个数copy到choicesTotal,把当前的选择copy到result。

  • cgiFormResultType cgiFormSelectMultiple( char *name, char **choicesText, int choicesTotal, int *result, int *invalid)

与cgiFormSelectSingle类似,只指向整型数组的result代表了选择的项。

  • cgiFormResultType cgiFormCheckboxSingle( char *name)

若复选框被选中,则函数返回cgiFormSuccess,否则返回cgiFormNotFound。

  • cgiFormResultType cgiFormCheckboxMultiple( char *name, char **valuesText, int valuesTotal, int *result, int *invalid)

与cgiFormCheckboxSingle类似,但它处理同一名字有多个复选框的情况。name指向复选框的名字;valuesText指向包含有每个复选框中参数的一个数组;valuesTotal指向复选框的总数;result是一个整型数组,每个复选框选中的用1代表,没选中的用0代表。

  • cgiFormResultType cgiFormRadio( char *name, char **valuesText, int valuesTotal, int *result, int defaultV)

与cgiFormCheckboxMultiple相似,只是这里是单选按钮而不是复选框。

  • void cgiHeaderLocation(char *redirectUrl)

重定向到redirectUrl指定的URL。

  • void cgiHeaderStatus(int status, char *statusMessage)

输出状态代码status和消息statusMessage。

  • cgiEnvironmentResultType cgiWriteEnvironment(char *filename)

本函数把当前CGI环境写入filename文件中以便以后调试时使用

  • cgiEnvironmentResultType cgiReadEnvironment(char *filename)

本函数从filename文件中读取CGI环境以便用来调试。

CGIC结果编码

CGIC结果编码参考:

cgiFormSuccess

提交信息成功

cgiFormTruncated

删除部分字节.

cgiFormBadType

错误的输入信息(没有按要求)

cgiFormEmpty

提交信息为空.

cgiFormNotFound

提交信息没有找到.

cgiFormConstrained

数字属于某个特定的范围,被迫低于或高于适当范围。

cgiFormNoSuchChoice

单一选择提交的值是不被接受。通常说明表但和程序之间存在矛盾。

cgiEnvironmentIO

从CGI环境或获取的文件读或写的企图失败,报出I/O的错误。

cgiEnvironmentMemory

从CGI环境或获取的文件读或写的REQUEST_METHOD 请求类型,如“GET”或“POST”

CGIC环境变量

CONTENT_TYPE 被发送数据的类型

CONTENT_LENGTH 客户端向标准输入设备发送的数据长度,单位为字节

QUERY_STRING 查询参数,如“id=10010&sn=liigo”

SCRIPT_NAMECGI 脚本程序名称

PATH_INFOCGI 脚本程序附加路径

PATH_TRANSLATEDPATH_INFO 对应的绝对路径

REMOTE_ADDR 发送此次请求的主机IP

REMOTE_HOST 发送此次请求的主机名

REMOTE_USER 已被验证合法的用户名

REMOTE_IDENTWEB 服务器的登录用户名

AUTH_TYPE 验证类型

GATEWAY_INTERFACE 服务器遵守的CGI版本,如:CGI/1.1

SERVER_NAME 服务器主机名、域名或IP

SERVER_PORT 服务器端口号

SERVER_PROTOCOL 服务器协议,如:HTTP/1.1

DOCUMENT_ROOT 文档根目录

SERVER_SOFTWARE 服务器软件的描述文本

HTTP_ACCEPT 客户端可以接收的MIME类型,以逗号分隔

HTTP_USER_AGENT 发送此次请求的web浏览器

HTTP_REFERER 调用此脚本程序的文档

HTTP_COOKIE 获取COOKIE键值对,多项之间以分号分隔,如:key1=value1;key2=value2企图失败,报出out-of-memory的错误。

cgiEnvironmentSuccess

从CGI环境或获取的文件读或写的企图成功。

注意

前端传递数组对象类型时,请求格式如下图所示:
在这里插入图片描述

对应的数据结构为:
在这里插入图片描述
若当前传递的数组为空,则键为 data[]

猜你喜欢

转载自blog.csdn.net/lzl980111/article/details/115297869