123下一页

[经验] 第46章 RL-TCPnet中CGI脚本使用方法

[复制链接]

版主

发表于 2018-1-9 15:50:35   298 查看 57 回复 显示全部楼层 倒序浏览
分享
转帖
本章节为大家讲解RL-TCPnet中CGI的实现方法,特别是具体的执行过程说明。关于这点非常有必要讲解下,否则后面学习了CGI也是云里雾里。
46.1 初学者重要提示
46.2 CGI实现动态HTML
46.3 Web网页的数据输入方法
46.4 CGI的POST数据输入方法
46.5 CGI的GET数据输入方法
46.6      总结

评分

参与人数 1积分 +5 收起 理由
star_66666 + 5 资源分享达人,加分鼓励!

查看全部评分

版主

发表于 2018-1-12 10:07:53    楼主|
46.1  初学者重要提示
1、学习本章节前,务必优先学HTML表单,非常非常重要。已经整理在这个帖子中,由于有不是我们创作的内容,就不往教程里面整理了 。

评分

参与人数 1积分 +5 收起 理由
star_66666 + 5 资源分享达人,加分鼓励!

查看全部评分

回复

点赞 举报

版主

发表于 2018-1-12 10:08:15    楼主|
2、CGI是HTTP和C代码通信的桥梁。基于此,客户端浏览器和Web服务器的互动才得以实现。

评分

参与人数 1积分 +5 收起 理由
star_66666 + 5 资源分享达人,加分鼓励!

查看全部评分

回复

点赞 举报

版主

发表于 2018-1-12 10:08:37    楼主|
46.2  CGI实现动态HTML
      通过前面章节HTML的学习,我们了解到使用HTML仅仅可以制作一个静态网页,需要实现服务器和客户端的互动得需要CGI的加入。CGI属于一种脚本语言,加入到HTML中也比简单,仅需要下面五条指令,放在HTML语句前面即可:

评分

参与人数 1积分 +5 收起 理由
star_66666 + 5 资源分享达人,加分鼓励!

查看全部评分

回复

点赞 举报

版主

发表于 2018-1-12 10:08:58    楼主|
加入了CGI脚本命令的文件,后缀名是.cgi。比如下面的HTML文件,我们希望它可以动态的显示信息,就可以为其添加CGI脚本命令:
t <HTML><HEAD><TITLE> Hello World Example </TITLE></HEAD>

t <H2 ALIGN=CENTER> Output a Greeting as Dynamic HTML </H2>

c a <p> %s </p>

t </BODY>

t </HTML>

.
回复

点赞 举报

版主

发表于 2018-1-12 10:09:20    楼主|
1、前两行以“t”脚本命令开始,表示该行是HTML语句,并将被发送到客户端浏览器。
2、第三行以“c”脚本命令开始,表示它是一个命令行。该行的其余部分将被传递到CGI接口函数cgi_func()的环境变量中。该环境变量称为env,将包含字符串“a <p>%s </ p>”。其中字符串开头的字母a是一个控制字符(控制字符不限制,可以是字母或者数字表示),而cgi_func()函数中必须包含解析这些字符的代码,然后格式化此行HTML代码的其余部分(所谓的格式化是指以HTML标准格式呈现)。
U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) {

switch (env [0]) {

case 'a':

len = sprintf ((S8 *) buf, (const S8 *) &env [2], "Hello World");

break;

}



return ((U16) len);

}
回复

点赞 举报

版主

发表于 2018-1-12 10:09:36    楼主|
当用户使用浏览器加载网页时,switch语句的 case ‘a’子句将被执行。sprintf()语句就变成了
len = sprintf ((S8 *) buf, <p>%s</p> , "Hello World");
回复

点赞 举报

版主

发表于 2018-1-12 10:09:50    楼主|
而buf就变成了:
<p> Hello World </p>
回复

点赞 举报

版主

发表于 2018-1-12 10:10:16    楼主|
然后将其输出到浏览器。浏览器会显示HTML代码,如下所示:
<HTML><HEAD><TITLE>Hello World</TITLE></HEAD>

<BODY>

<H2 ALIGN=CENTER>Output a Greeting as Dynamic HTML</H2>

<p> Hello World </p>

</BODY>
回复

点赞 举报

实习生

发表于 2018-1-12 10:11:06  
谢谢分享
回复

举报

版主

发表于 2018-1-12 10:50:25    楼主|
浏览器的实际显示效果:
                              
用户可以应用CGI脚本到HTML文本的任何部分,以便实现HTML的动态显示。在上面举的例子中,只使用了一个用户定义控制字符,实际应用中可以使用多个控制字符来构建复杂的动态页面。

回复

点赞 举报

版主

发表于 2018-1-12 10:50:49    楼主|
46.3  Web网页的数据输入方法
      接下来,我们来看看如何将数据从Web浏览器发送到服务器端的C应用程序中。CGI支持两种数据输入方法,GET和POST。两者都支持HTTP表单来输入数据,关于HTTP表单, 。
回复

点赞 举报

版主

发表于 2018-1-12 10:51:10    楼主|
1、GET方法
      如果表单提交是被动的(比如搜索引擎查询,输入查询不会更改网络上保存的任何数据),并且没有敏感信息,则应该使用GET方法。因为当用户使用 GET 时,表单数据在页面地址栏中是可见的:
<font size="3">action_page.php?firstname=Mickey&lastname=Mouse</font>
并且浏览器会设定容量限制,所以GET 适合少量数据的提交。
回复

点赞 举报

版主

发表于 2018-1-12 10:51:27    楼主|
2、POST方法
      如果要使用输入数据进行更改,或者包含敏感信息(例如密码),则应使用POST方法,因为POST 安全性更好,且被提交的数据在页面地址栏中是不可见的。例如,将数据输入数据库来更改该数据库的状态,应使用POST方法。又比如将数据输入到一个小型的嵌入式Web服务器中,也应该使用POST方法。
      总的来说,GET方法适用于改变Web服务器中的环境变量,而POST方法用于用户和C应用程序代码之间传输数据。
回复

点赞 举报

版主

发表于 2018-1-12 10:51:42    楼主|
46.4 CGI的POST数据输入方法
      下面通过一个实例讲解POST方式的数据输入,比如实现一个允许用户通过Web浏览器输入数据的功能,我们需要添加一个单元格和提交按钮到网页。基本代码如下:
<html>

  <head>

    <title>Post example</title>

  </head>

  <body>

    <form action="index.cgi" method="post" name="CGI">

      <table>

        <tr>

          <td>

            <input type="text" id="textbox1" size="16" value="" />

          </td>

          <td align="right">

            <input type="submit" id="change" value="change" />

          </td>

        </tr>

      </table>

    </form>

  </body>

</html>
回复

点赞 举报

版主

发表于 2018-1-12 10:52:01    楼主|
反映到浏览器上的显示效果如下:

回复

点赞 举报

版主

发表于 2018-1-12 10:52:19    楼主|
用户查看此页面时,会看到单元格“textbox1”和提交按钮“change”。用户向单元格中填入数据后,按下按钮会触发POST数据输入方式,“textbox1”中的数据将传送到CGI接口函数。RL-TCPnet会调用HTTP_CGI.c文件中函数CGI_process_data()来处理。
void cgi_process_data (U8 *dat, U16 len) {

unsigned char text1 [16];

var = (U8 *) alloc_mem (40);

do {

dat = http_get_var (dat, var, 40);

if (var [0] != 0 ) {

if (str_scomp (var, "textbox1") == __TRUE) {

str_copy (text1, var+4); // extract user data

process_Input (text1); // user function to process data

}

}

}

}
回复

点赞 举报

版主

发表于 2018-1-12 10:52:34    楼主|
两个函数CGI_process_data()和CGI_process_var()分别用于POST和GET方式的数据处理。用户必须编写CGI_process_data()函数以便从textbox1单元格中获取数据。在函数CGI_process_data中申请一个名为var的缓冲区,然后通过调用函数http_get_var()复制字符串数据到缓冲区。这个字符串包含单元格的名称和已输入的任何数据。字符串格式如下:
textbox1=<input text>
回复

点赞 举报

版主

发表于 2018-1-12 10:52:50    楼主|
现在,用户需要做的就是添加代码来解析这个字符串并传递输入数据到C应用程序。基本的POST方法允许用户从任何HTML表单输入数据。但是用户点击了提交按钮后,表单将重新加载,会显示默认选项。比如设计的网页中使用了单选按钮和复选框之类的元素,重新加载后需要显示当前配置,而不能继续显示默认配置。为此,用户需要同时使用CGI动态HTML和CGI POST方法。当页面加载或刷新时,CGI_func()必须输出当前设置。如果输入新值,将继续由函数CGI_process_data()处理。
回复

点赞 举报

版主

发表于 2018-1-12 10:53:33    楼主|
对于一个简单的文本框,HTML需做如下修改:
回复

点赞 举报

123下一页
高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区