一:下载资源
https://download.csdn.net/download/weixin_44474051/89243285
里面包含了前端测试代码,cgi 代码和cJSON代码
二:框架流程
前端网页---->get/post请求------>cgi处理请求---->进程通信---->主程序处理对应请求(网页功能具体实现和返回网页需要数据)
三:前端网页
这里不讨论前端网页实现,建议用js实现,完全和后端分离无关,将实现的网页放到lighttpd 所在的webpages文件夹下即可,这里我们直接用vs code 的扩展插件REST Client 实现网页请求(模拟网页的功能)
四:REST Client 使用
下载vs code,在vs code扩展里下载REST Client即可,然后新建文本以.http后缀结尾测试内容如下:
点击Send Request即可发送对应下面的内容,上图中三个request 第一个是发送get请求,点击后右边会显示cgi程序发回来内容,第二个和第三个request分别是两个post 一个是发的int类型,一个是字符串类型,cgi会收到这两个类型的数据。192.168.1.218 是lighttpd web服务器所在板子的ip,ctest.cgi 是我们的cgi程序。
五:数据格式
我们要先确认数据格式协议,这样才能和前端交互解析,一般就用JSON数据格式,简单的JSON格式如下:
{
"mux_mode": 1,
"net_ip": "192.168.1.218",
}
所有的数据交互都按照JSON格式,前面是字段用来遍历,后面是数据可以是整形也可以是字符串,数据格式我们可以用cJSON库,直接把cJSON.c和cJSON.h两个文件放到cgi工程里即可调用相关接口解析数据和打包数据
六:cJSON接口
cJSON_CreateObject:创建JSON对象
cJSON_CreateString:创建字符串
cJSON_CreateNumber:创建int类型数据
cJSON_AddItemToObject:添加到JSON对象中
cJSON_Print:呈现为标准的JSON格式
cJSON_Delete:JSON对象删除,做一些释放内存的工作
cJSON_Parse 获取数据
cJSON_GetObjectItemCaseSensitive 从获取的数据遍历字段,并返回对象
七:cgi程序
cgi 程序和普通c程序的主要区别就是重载的输入输出用于数据的接收的上报,能从相应的环境变量里获取网路相关参数,所以printf这个函数没办法用来debug了,可以通过写log到文件的方式debug,其他地方和普通c程序无差异,按照普通c程序来写和编译即可,下面的代码是简单处理get (上报了"mux_mode":1 数据)和post(解析了"net_ip":"192.168.1.218" 数据) 的代码
int main()
{
printf("Content-Type:xxx/html;charset=utf-8\r\n");
printf("\r\n");
char *ret = getenv("REQUEST_METHOD");
if(strncmp(ret,"GET",3) == 0)
{
cJSON *mux_mode = NULL;
mux_mode = cJSON_CreateNumber(1);
cJSON_AddItemToObject(obj, "mux_mode", mux_mode);
char *res_string = cJSON_Print(obj);
printf("%s",res_string);
cJSON_Delete(obj);
}
else if(strncmp(ret,"POST",4) == 0)
{
int len,i;
char buff[100];
len = atoi(getenv("CONTENT_LENGTH"));
for(int i=0;i<len;i++)
{
buff[i]=(char)fgetc(stdin);
}
cJSON *data_json = NULL;
cJSON *head = NULL;
data_json = cJSON_Parse(buff);
head = cJSON_GetObjectItemCaseSensitive(data_json, "net_ip");
if (cJSON_IsString(head) && (head->valuestring != NULL))
{
if(strcmp(head->valuestring,"192.168.1.218")==0)
{
//do somthing what you want
}
}
cJSON_Delete(data_json);
}
}
代码编译后重命名为ctest.cgi后放到对应lighttpd 所在目录下的cgi-bin 文件下即可