转载自https://blog.csdn.net/guodongxiaren/article/details/50569675
本文写给C/C++程序猿,也适合其他对历史感兴趣的程序猿
=============================================
谈到web开发,大家首先想到的PHP、JavaEE/JSP、.NET/ASP、Ruby on rails、Python的Django等等。可谓百花齐放,你一般不会想到C++和Web开发有什么关系,但其实动态网页的开发(web开发)可是在这些动态网页语言诞生之前就存在了的。所以C/C++也是可以做web开发的,它利用的技术是——CGI。
在天地初开,混沌未分之时,动态网页语言尚未出世,要实现动态网站依赖的就是CGI。谷歌/百度一下CGI,可能会出现很多名词:CGI脚本、CGI程序、CGI标准等等。其实这些都是站在不同角度来说的,CGI即Common Gateway Interface的缩写,直译为“通用网关接口”。第一次听这个名字,我也不知道是个什么鬼东西。归根结底 CGI就是一个接口协议。协议就是大家公认的一套标准(叫CGI标准也可以),比如网络协议。大家都遵守一套标准,就减少了沟通的难度。进行CGI开发,就是编写一个CGI可执行程序。其实各种语言都可以编写CGI,不但Java、Python、PHP、C#……可以,而且Shell也可以。当然C和C++也可以。由于早期CGI很多是由Perl(脚本语言)开发的,所以CGI程序也称CGI脚本,其实这个称呼不一定准确。因为C++编译出的可执行文件同样可以是CGI。
在PHP和Java大行其道的今天,很多人看来用C++编写CGI是几乎淘汰的技术了(其实这到不然,只是比较小众罢了)。所以如果你对C/C++感兴趣或者对历史感兴趣都可以阅读本文。
一次网页请求与响应
预备前端知识
- form表单提交(html原生)
- js操纵下的表单提交
- js通过Ajax请求数据
-
<h1>表单提交
</h1>
-
<form action="/cgi-bin/hello.cgi" method=“get”>
-
<table>
-
<tr>
-
<td>用户名:
</td>
-
<td>
<input name=“username”/>
</td>
-
</tr>
-
<tr>
-
<td>密码:
</td>
-
<td>
<input name=“password”/>
</td>
-
</tr>
-
<tr>
-
<td>
<input type=“submit” value=“OK”/>
</td>
-
</tr>
-
</table>
-
</form>
环境变量与CGI处理
REQUEST_METHOD | 前端页面数据请求方式:get/post |
QUERY_STRING | 采用GET时所传输的信息 |
CONTENT_LENGTH | STDIO中的有效信息长度 |
SCRIPT_NAME | 所调用的CGI程序的名字 |
SERVER_NAME | 服务器的IP或名字 |
SERVER_PORT | 主机的端口号 |
-
//比如
-
chr* str =
NULL;
-
str = getenv(
“QUERY_STRING”);
cout<<“Content-Type:text/html\n\n”<<endl;
WARNNING:这里要注意,一定要输出两个换行符(\n)。因为HTTP协议的首部和消息实体(如HTML代码)
之间用空行分割。
Cgicc库
CGI的痛点与FastCGI
现代CGI的编程范式
- JS可以使用Ajax技术来向后台CGI发起数据请求。Ajax完成的是不需要刷新整个页面就可以加载后端数据(比如从数据库中取出)。
- CGI一般不再用于直接返回html页面,同时将复杂的计算、IO任务下沉到后端(后端可以进一步进行路由转发,实现负载均衡)。使CGI作为前后端之间的中间层。彼时CGI的职能是完成基本的数据交换:解析前端数据请求,再转发给对应后端;然后从后端取回数据,给前端返回XML或JSON。
- 前端JS利用XML/JSON中的数据来进行填充,绘制出丰富的页面。