虽说目前的web服务基本上都是基于前后端解耦的各种框架进行开发,之前学head first servlet这本书的时候甚至看到作者当时(十年前)就说CGI技术已经比较落后了
但是目前看到有好些物联网设备都是使用CGI技术的,所以可以了解一下,实际上跟servlet有一些相似之处。
以网上现成的例子(https://blog.csdn.net/no_pao_spite/article/details/73188241)举例:
html前端
<html> <head> <TITLE>CGI1:hello CGI</TITLE> </head> <body> <form action="cgi-bin/cgi_add.cgi"> //这里非常像servlet吧,这个表单的action是请求到了下文的cgi <p> 请在下面填入数A 和 数B,按下确定后,可以获得二数相加的结果<br> A:<input name="num_a" size="5"/> B:<input name="num_b" size="5"/><br> Result:<input name="result" size="10"><br> <input type="submit" value="OK"> </form> </body> </html> cgi程序 #include <stdio.h> #include <stdlib.h> int main(void) { char *data; long m,n; printf("%s ","Content-Type:text/html;charset=gb2312\r\n\r\n"); //必须要有这一部分,指定了编码和内容类型 printf("<title>add result</title> "); printf("<h3>add result</h3> "); data = getenv("QUERY_STRING"); //以环境变量QUERY_STRING传参,实现前后端交互 if(data == NULL) printf("<P>error:no data receive"); else if(sscanf(data,"%*[^=]= %ld& %*[^=] =%ld& %*[^=]=",&m,&n)!=2) //使用sscanf函数从data这个字符串中读取到点击提交按钮所下发的数A和数B的值 printf("<P>error:must be number"); //正则判断的意思是取到等号后的数值,等号后有空格时忽略空格 else printf("<P>%ld + %ld=%ld",m,n,m+n); return 0; }
是的,CGI确实挺麻烦的,要自己从底层开始写起,所以后面被取代了,但在性能受限的iot设备上,cgi则成为了经济实惠的选择,这使得我们不得不去了解它。以上