# web-demo **Repository Path**: magic77elva/web-demo ## Basic Information - **Project Name**: web-demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-22 - **Last Updated**: 2024-11-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1、首先安装boa webserver ## 2、查看并指定运行程序及目录 在/etc/boa/boa.conf中声明了cgi的目录,和网页打开的位置 ``` boa.conf /etc/boa/boa.conf cgi-bin/* /usr/lib/cgi-bin/* index.html /var/www/ xmlhttpreq.js /var/www/ ``` ## 3、目前使用bootstrap进行网页界面的开发 ### 1)界面设计完成,生成html文件,在其中添加我们要响应的接口 ``` ``` 添加js文件响应 ``` ``` ### 2)在js文件中处理我们的界面逻辑 ## 4、cgi中处理我们的数据 ### 1)目前是给飞凌板子设计的,所以使用飞凌的编译链 ``` . /opt/fsl-imx-x11-cortexa7hf/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi make clean;make build ``` ### 2)由于cgi文件我们调用的是二进制,调试不方便,所以封装了几个函数,将打印写入文件中查看 ``` // 打开日志文件 FILE *open_log_file(const char *filename) { FILE *log_file = fopen(filename, "a"); if (!log_file) { perror("Failed to open log file"); exit(EXIT_FAILURE); } return log_file; } // 写入日志文件 void write_to_log(FILE *log_file, const char *format, ...) { va_list args; va_start(args, format); vfprintf(log_file, format, args); va_end(args); } // 关闭日志文件 void close_log_file(FILE *log_file) { if (log_file) { fclose(log_file); } } ``` ## 5、问题记录 ### 1)获取网页上的type值,如何传入的json数据,下位一直出错 ``` char *req_method = getenv("REQUEST_METHOD"); //获取GET POST char *query_string = getenv("QUERY_STRING"); //获取整个包数据,查看前端传下来的完整数据 “/cgi-bin/app.cgi?type=get_current_data&random” 封装了函数专门提取type值 char *get_query_param(const char *query_string, const char *param) { if (query_string == NULL || param == NULL) { return NULL; // 输入无效 } char *query_copy = strdup(query_string); // 复制查询字符串以便修改 if (query_copy == NULL) { return NULL; // 内存分配失败 } char *param_value = strtok(query_copy, "&"); // 使用strtok来提取参数 while (param_value != NULL) { // 查找参数名 char *equals_sign = strchr(param_value, '='); if (equals_sign != NULL) { *equals_sign = '\0'; // 截断参数名和值 if (strcmp(param_value, param) == 0) { // 找到了匹配的参数 *equals_sign = '='; // 恢复等号 return strdup(equals_sign + 1); // 返回参数值 } } param_value = strtok(NULL, "&"); // 继续提取下一个参数 } free(query_copy); // 释放复制的查询字符串 return NULL; // 没有找到匹配的参数 } ```