lighttpd web服务器通过cgi前后端数据交(完全实现前后端分离)

一:下载资源

      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 文件下即可

       

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值