嵌入式Linux下用C语言写后端接口——CGI实现

2023-11-17

简介

CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与 Web 服务器交互的一个标准接口。服务器端与客户端进行交互的常见方式多,CGI 技术就是其中之一。根据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作。CGI规范定义了Web服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容。

实验环境

已经移植好嵌入式Web服务器Boa的开发板,Boa是支持CGI的。
关于BOA服务器的移植 请移步 BOA移植

下载CGIC库源码

git下载地址:CGIC
可以通过git clone下载或者以下方式下载:
在这里插入图片描述
下载完ZIP压缩包后放到虚拟机中去。
用以下命令解压:

unzip cgic-master.zip

配置CGIC编译

修改Makefile

vim Makefile

将 CC AR RANLIB都改成自己交叉编译工具对应的工具
在这里插入图片描述
我的交叉编译工具链是arm-linux-gcc 所以我的修改如下:
在这里插入图片描述
将Makefile第22 25改为如下:
在这里插入图片描述
执行make命令编译

make -j8

编译成功后会生成 capture 和 cgictest.cgi

将 capture 和 cgictest.cgi 放置到开发板中的存放cgi的目录中去 比如我的是/var/www/cgi-bin/

cp capture cgictest.cgi NFS/rootfs/var/www/cgi-bin/

测试CGI接口

capture
capture是一个调试程序 你可以将你的网页表单提交地址指向它,之后它会捕捉你表单的内容存储到你指定的目录中去,在使用前要修改下源码
capture代码如下:
在这里插入图片描述
修改上面的/CHANGE/THIS/PATH/capcgi.dat 为你想要将捕捉的内容保存到哪个个文件。
将表单提交地址指向capture后 效果如下:
在这里插入图片描述
此时在你指定的保存目录中已经生成了保存的表单信息!

cgictest.cgi
cgictest.cgi是一个CGI接口的测试程序,我们可以通过网页链接直接访问它,比如我可以访问我的开发板:http://192.168.232.201/cgi-bin/cgictest.cgi
然后页面就会显示该CGI接口提供的HTML页面。
效果如下:
在这里插入图片描述
我们可以通过CGIC提供的cgictest.cgi来了解下CGIC库的用法。

编写一个简单的获取表单的CGI接口

1.首先我们需要准备一份简单的HTML表单页面,这里就以一个简单的登录表单为例 HTML代码如下:

<html>
<head></head>
	<form action="cgi-bin/login.cgi">
	User:<br>
	<input type="text" name="user" value="yaomianfa">
	<br>
	passwd:<br>
	<input type="text" name="passwd" value="st123456">
	<br><br>
	<input type="submit" value="Submit">
	</form>
</html>

该html效果如下:
在这里插入图片描述
我们的目的就是通过CGI接口获取到user字段的值和passwd字段的值

将该HTML代码保存为login.html
然后放置到开发板的www目录中:

cp login.html NFS/roots/var/www/

2.编写CGI接口
我们的HTML表单中指定了提交地址:

<form action="cgi-bin/login.cgi">

所以我们需要编写的cgi接口名字为login.cgi

login.c接口代码如下:

#include "cgic.h"
int cgiMain() { //cgi程序以cgiMain作为入口点
	char userbuf[100];  //存储用户名的缓存区
	char pwdbuf[100];  //存储密码的缓存区
	cgiFormString("user", userbuf, 100); //从表单中的user字段获取值存入到userbuf
	cgiFormString("passwd", pwdbuf,100); //从表单中的passwd字段获取值存入到pwdbuf
	cgiHeaderContentType("text/html"); //设定输出的内容格式 这里我们要输出HTML
	fprintf(cgiOut,"<title>Test by yaomianfa</title>"); //输出HTML
	fprintf(cgiOut,"<h1>test!!</h1>");
	fprintf(cgiOut,"username: %s",userbuf);
	fprintf(cgiOut,"<br>"); //HTML的换行标签
	fprintf(cgiOut,"passwd: %s",pwdbuf);
	return 0;
}

编译login.c 生成login.cgi
这里我们偷个懒 将login.c复制到我们下载的cgic库目录中去

cp login.c cgic-master/

修改cgic-master/Makefile
加入一个新的编译目标:
在这里插入图片描述
执行下列命令编译:

make login.cgi

生成login.cgi
在这里插入图片描述
将login.cgi放置到开发板中的cgi目录中去

cp login.cgi NFS/rootfs/var/www/cgi-bin/

测试login.cgi

访问开发板的登录页面:

http://192.168.232.201/login.html

在这里插入图片描述
点击Submit提交到我们的CGI接口中去

CGI接口处理信息后输出HTML:
在这里插入图片描述
至此CGI接口编写成功。

CGIC接口API

关于CGIC提供的所有API,可以源码目录下面的这两个文件中可以查看:README.md 和 cgic.html
在这里插入图片描述
这里提一下CGIC获取表单的接口API的命名
所有获取表单的API的命名如下:
cgiFormXXXXX
cgiFormXXXXX的第一个参数都是要获取的字段名
从表单中获取字符串用的是 cgiFormString
获取小数用的是 cgiFormDouble
检测复选框有没有被勾选:cgiFormCheckboxSingle
cgiFormRadio()可以确定一组具有相同名称的单选框中的哪一个被选中了
cgiFormInteger 从表单中获取整数 等等
还有一些函数可以操作cookie 设置HTML头部的一些信息
具体看上面两个文件中关于函数的介绍就知道了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux下用C语言写后端接口——CGI实现 的相关文章

  • 控制缓存过期

    通过 Google 网站管理员工具的 PageSpeed 分析器运行我的网页后 它向我报告我的资源没有被缓存 下面是我的 htaccess 文件中直接取自 H5BP 的代码 我是否正确地假设以下过期时间设置正确 但我的实现中出现了问题 或者
  • Jquery $(window).width() 不包括滚动条宽度?

    我有一个页面使用 javascript 设置了很多 css 属性 并使用 window width 来确定页面宽度 除此之外 它还使用该方法将一些 div 宽度设置为页面的完整宽度 A 这样做是因为很多其他计算都是在 javascript
  • 我应该使用哪种 MIME 类型来为 XHTML5 提供 IE7 和 IE8 服务?

    我想使用 XHTML5 但显然他们两个浏览器不接受application xhtml xmlMIME 类型 我读到他们会接受text xml or application xml不确定 但这有点黑客 所以我想知道我是否应该只为 IE7 和
  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 当最初在范围内设置值时,日期选择器弹出格式不起作用

    我正在使用 Angular UI 引导日期选择器弹出窗口 并在 Plunker 上使用此自定义指令 http plnkr co edit 053VJYm1MpZUiKwFTfrT p preview http plnkr co edit 0
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 自定义 SVG 未加载到我的图像标签中

    目前我正在尝试将自定义 svg 组件加载到图像标签内 但由于某种原因 我无法看到地图组件内的 svg 图像 我的自定义 SVG 文件如下所示 我在 SVG 中加载另一个图像
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • a:悬停颜色不起作用

    一件很奇怪的事情 我想在悬停时更改链接的文本颜色和背景颜色 这是代码 css link menu a color white display block height 100 width 100 text decoration none t
  • 用 C++ 解析 HTTP 标头

    我正在使用curl 与服务器通信 当我发出数据请求时 我收到 HTTP 标头 后跟由边界分隔的 jpeg 数据 如下所示 我需要解析出 边界字符串 内容长度 我已将传入数据复制到 char 数组 如下所示 static size t OnR
  • 哪些 HTML 元素不能包含子节点?

    我一直在寻找一份详尽的清单 但在任何地方都找不到 为了避免必须仔细阅读规范 有谁知道它们是什么 我认为可以包含子元素的补充元素列表也很有用 XHTML 1 和 HTML5 之间的列表有何不同 您可以在以下位置找到 void 元素 不能有任何
  • Next.js:错误:React.Children.only 期望接收单个 React 元素子元素

    我有一个名为Nav inside components目录及其代码如下所示 import Link from next link const Nav gt return div a Home a a About a div export d
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 在 Android Chrome 中隐藏 HTML5 音频/视频通知

    我的网络应用程序上有一个 HTML5 音频元素 在某些时候 我使用以下代码以编程方式停止播放 audioElement pause audioElement currentTime 0 播放音频时 我的 Android 设备 使用 Goog
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 使用 File API polyfill 读取数据 URL

    我正在尝试使用文件 API 库 https github com mailru FileAPI https github com mailru FileAPI 作为不支持文件 API 的浏览器的后备 以便将文件作为数据 URL 读取并将其传
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字

随机推荐

  • LeetCode题解——394. 字符串解码

    题目相关 题目链接 LeetCode中国 https leetcode cn com problems decode string 注意需要登录 题目描述 给定一个经过编码的字符串 返回它解码后的字符串 编码规则为 k encoded st
  • 昨晚做梦面试官问我三色标记算法

    本文已收录至GitHub 推荐阅读 Java随想录 微信公众号 Java随想录 原创不易 注重版权 转载请注明原作者和原文链接 文章目录 三色标记算法 增量更新 原始快照 某天 爪哇星球上 一个普通的房间 正在举行一场秘密的面试 面试官 我
  • Sql server 存储过程加密

    本方法可用于加密SQL存储过程 函数或者触发器 使用 WITH ENCRYPTION 选项 WITH ENCRYPTION 子句对用户隐藏存储过程的文本 例子 IF OBJECT ID N Pro Encrypt Test IS NOT N
  • PySide6-控件教程-005-QLabel标签控件-内边距、缩放、伙伴关系

    QLabel 标签控件 本文摘录自我的开源教程 PySide6 代码式教程 QLabel CSDN 平台仅做镜像 答疑 纠错请至 GitHub 提交 issue 内边距 QLabel还可以调整内边距 启用内容缩放 以更细致地调节显示效果 s
  • 与游戏世界交互作业

    一 编写一个简单的鼠标打飞碟 Hit UFO 游戏 游戏内容要求 游戏有 n 个 round 每个 round 都包括10 次 trial 每个 trial 的飞碟的色彩 大小 发射位置 速度 角度 同时出现的个数都可能不同 它们由该 ro
  • 如何将Python项目部署到新电脑上运行?

    如何将Python项目部署到新电脑上运行 在工作中 可能需要在新服务器上部署项目代码 例如新增服务器 把测试环境的代码部署到生产环境等 在生活中 也会遇到换新电脑 需要将自己在旧电脑上写的 项目 代码拷贝到新电脑上运行 本文将这个过程中的关
  • SSH版本信息可被获取漏洞解决方法CVE-1999-0634

    直接执行 cd etc touch ssh banner change echo Version is empty gt gt etc ssh banner change cd etc ssh cp sshd config sshd con
  • log4j漏洞复现

    第一步 下载marshalsec 源码进行编译 https github com mbechler marshalsec 下载后进行编译打包 mvn clean package DskipTests 得到jar文件 在这里插入图片描述 第二
  • Stable Diffusion 系列教程

    目录 1 提示词 基本的规则 2 提示词分类 2 1内容性提示词 2 2 画风艺术派提示词 2 3 画幅视角 2 4画质提示词 3 反向提示词 3 1 内容性反向提示词 3 2 画质性反向提示词 4 实例分析 5 权重 5 1 方法一 5
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • java七大排序——7_归并排序

    归并排序 将数组分为2块 再到每一小块再分为两块 直到最后一个元素为一块 然后进行有序数组合并 最终合并为一个有序数组 代码实现 public static void mergeSorts int array mergeSortsInter
  • 软件设计师--结构化开发

    结构化开发 耦合 真题 内聚 真题 设计原则 真题 系统文档 真题 数据流图 数据流图基本数据元素 外部实体 数据存储 加工 数据流 父图子图平衡 加工既要有输入数据流也要有输出数据流 数据守恒 真题 数据字典 真题 杂题精选 耦合 真题
  • [1051]python yagmail发邮件

    文章目录 安装 开通SMTP服务 常用邮箱host以及port yagmail 可以更简单的来实现自动发邮件功能 github项目地址 https github com kootenpv yagmail 安装 pip install yag
  • 备战金九银十: GitHub 上标星 46k+的《10 万字Java面试总结》,助你搞定面试官

    不论是校招还是社招都避免不了各种面试 笔试 如何去准备这些东西就显得格外重要 不论是笔试还是面试都是有章可循的 我这个有章可循 说的意思只是说应对技术面试是可以提前准备 运筹帷幄之后 决胜千里之外 不打毫无准备的仗 我觉得大家可以先从下面几
  • python tkinter 点击按钮选择文件,返回文件路径

    关于python tkinter 点击按钮选择文件 返回文件路径 这个方法我找了好几天 终于曲线救国实现了 首先分为两步 1 设计对话框选择文件 下面的代码搞了好几天 才发现全局变量的获取 必须放在root mainloop的最后 反正网上
  • MAC软件推荐(Java方向)

    MAC软件推荐 Tabby 终端控制工具 keka 解压工具 typora Markdown工具 QuickRedis Redis视图工具 UTM 虚拟机 Navicat Premium 数据库工具 Adobe Photoshop CC 2
  • Android-App的设计架构经验谈,终获offer

    前言 想要成为一名优秀的Android开发 你需要一份完备的知识体系 在这里 让我们一起成长为自己所想的那样 学算法真的很痛苦 虽然大数据现在很火 但找到适合自己定位的职业也未尝不是一种合理选择 投百度的经历非常坎坷 想写出来和大家分享一下
  • runtimeService 运行时服务组件

    在Activiti中 启动一个流程后 会创建一个流程实例 ProcessInstance继承Execution 两个都是接口 每个流程实例至少会有一个执行流 Execution 当流程实例没有流程分支时 一般情况下只会存在一个执行流 假设出
  • 计算机采用二进制每秒,计算机为什么采用二进制

    计算机为什么采用二进制 2018 09 12 电脑为什么要采用二进制计算 计算机中的一切计算都是用二进制进行的 平时我们用的十进制是逢十进一 二进制则是逢二进一 我们用的算盘事实上有两种用法 一种是十进制 一种是十六进制 算盘中代表 五 的
  • 嵌入式Linux下用C语言写后端接口——CGI实现

    文章目录 简介 实验环境 下载CGIC库源码 配置CGIC编译 测试CGI接口 编写一个简单的获取表单的CGI接口 测试login cgi CGIC接口API 简介 CGI Common Gateway Interface 公共网关接口 是