cgi从boa传数据到html,树莓派WEB服务器(Boa)CGI编程入门

经过上一个课程“Boa基本设置与使用”的学习,你们在树莓派上应已经会安装、配置、运行Boa服务器,而且访问到服务器上的一个静态网页。

这不是运行Web服务器最终的目的,最终应是经过B/S(浏览器/服务器)模式实现两端的相互。html

下面经过一个CGI编程实例来学习,WEB服务器的动态编程技术。“体重指数(BMI)计算器”,用户输入本身的身高与体重后点击计算,服务器就会计算出BMI数值。web

体重指数(BMI)计算器

d7bd9130a4a7b95cbb3385290116ffaf.png

开发设计流程

Created with Raphaël 2.1.0

界面功能设计

静态html文件,html程序显示界面

静态cgi文件,cgi程序显示界面

动态cgi文件,cgi程序处理用户数据显示

调试运行

1、HTML静态显示

1 . 静态的html文件编程

cgi.html浏览器

bmi.png

体重指数(BMI)计算器

身高 : cm 体重 : kg
BMI =

bmi_index.png

2、CGI程序输出页面

CGI基本概念

CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。经过CGI接口,Web服务器就可以获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。bash

WEB服务器和CGI程序之间的通信

服务器和CGI程序之间是经过标准输入输出来进行数据传递的,而这个过程须要环境变量的协做方可实现。服务器

1.服务器将URL指向一个应用程序

2.服务器为应用程序执行作准备

3.应用程序执行,读取标准输入和有关环境变量

4.应用程序进行标准输出svg

1ed0367ea54046b4a601c7361675318d.png

服务器上运行的cgi 经过标准输入(环境变量)来取得客户端用户数据,经过标准输出向客户端返回数据显示。函数

CGI数据输出

CGI程序如何将信息处理结果返回给客户端?这其实是CGI格式化输出。

在CGI程序中的标准输出stdout是通过重定义了的,它并无在服务器上产生任何的输出内容,而是被重定向到客户浏览器,这与它是由C,仍是Perl或Python实现无关。

因此,咱们能够用打印来实现客户端新的HTML页面的生成。好比,C的printf是向该进程的标准输出发送数据,Perl和Python用print向该进程的标准输出发送数据。学习

课程中CGI程序使用C语言编程。

向标准输出发送网页内容时要遵照MIME格式规则:

任意输出前面必须有一个用于定义MIME类型的输出内容(Content-type)行,并且随后还必须跟一个空行。ui

printf( "Content-type:text/html\n\n" );

2 . cgi显示界面程序

bmi.c

#include

int main()

{

printf( "Content-type:text/html\n\n" );

printf("

\n");

printf("

printf("

bmi.png%5C%22 \n");

printf("

体重指数(BMI)计算器

\n");

printf("

身高 : cm \n");

printf("

体重 : kg \n");

printf("

\n");

printf("

BMI = \n");

printf("

\n");

printf("

bmi_index.png%5C%22 \n");

printf("

\n");

return 0;

}

CGI程序的编译执行

$gcc bmi.c -o bmi.cgi //gcc编译器编译

$cp bmi.cgi /var/www/cgi-bin/ //拷贝到boa服务器设定的cgi-bin目录

//在客户端浏览器输入cgi程序地址如:10.1.1.123/cgi-bin/bmi.cgi 回车后就可看到本文最开始显示的web页面。

3、CGI程序数据处理

CGI环境变量

对于CGI程序来讲,它继承了系统的环境变量。CGI环境变量在CGI程序启动时初始化,在结束时销毁。

当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了关于HTTP服务器、客户端、CGI传输过程等项目。

5ad231b1724580d02881156e7ce3c43d.png

CGI数据传输方式

REQUEST_METHOD:它的值通常包括两种:POST和GET,但咱们写CGI程序时,最后还要考虑其余的状况。

1.POST方法

若是采用POST方法,那么客户端来的用户数据将存放在CGI进程的标准输入中,同时将用户数据的长度赋予环境变量中的CONTENT_LENGTH。

2.GET方法

在该方法下,CGI程序没法直接从服务器的标准输入中获取数据,由于服务器把它从标准输入接收到得数据编码到环境变量QUERY_STRING(或PATH_INFO)。

3.POST与GET的区别

以 GET 方式接收的数据是有长度限制,而用 POST 方式接收的数据是没有长度限制的。而且,以 GET 方式发送数据,能够经过 URL 的形式来发送,但 POST方式发送的数据必需要经过 Form 才到发送。

CGI程序实现步骤

从服务器获取数据

C语言实现代码:

POST方法

length = atoi(getenv(“CONTENT_LENGTH”));

inputstring = malloc(sizeof(char)*length + 1);

fread(inputstring, sizeof(char), length, stdin);

GET方法

inputstring = getenv(“QUERY_STRING”);

CGI程序获取数据都是连续字符串要进行解析才能获得独立数据。

getvalue.h文件中给出处理函数get_value( )

3 . cgi数据动态处理程序

在上面bmi.c基础上进行修改,首先在main函数最前面加上如下代码。

int main(){

char *val_cm = NULL;

char *val_kg = NULL;

int cm,kg,len=0;

float mm,bmi=0.0;

set_env(getenv("REQUEST_METHOD"),

getenv("CONTENT_LENGTH"),

getenv("QUERY_STRING"));

//

val_cm = get_value("cm"); //经过变量名获取身高

val_kg = get_value("kg"); //经过变量名获取体重

cm = atoi(val_cm);

kg = atoi(val_kg);

if(cm > 0 && kg > 0){

mm = cm/100.0;

bmi = (kg / (mm * mm));

}

...

//这里是页面显示代码

...

}

下面输出bmi数据的html代码。

printf(" \n");

修改为输出计算出用户数据的代码。

if(bmi == 0.0)

printf(" \n");

else

printf(" \n",bmi);

编译后copy到cgi-bin目录,如今用户在浏览器就能够输入数据提交后,服务器计算结果显示。

若是浏览器出现502错误,说明 cgi程序运行有问题。能够在终端下运行调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值