Boa服务器下的ajax与cgi通信

时间:2016.07.23 发布人:furuo6119

Boa服务器下的ajax与cgi通信

已解决问题

谷歌furuo6119用户在2016.07.23提交了关于“欧菲莱斯Boa服务器下的ajax与cgi通信”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-01T03:14:40。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !

希望以下的回答,能够帮助你。

第1个回答

用户名:airtqohis  

最近在最有做一个嵌入式课程著带设计,要求是利用基于cortaxa8的物联网实验箱做一个简单的嵌入式网页交互系统作为课程设计来验收评分。因为本身自己是学前端的,所以网页部分并不是重点,主要是和boa服务器之间的通信,课程实验给的例子是直接使用printf来问答打印html标签形成新的页面,有过前端开发经验的人都知道这种做法效率低下而且没有办法实现异步刷新,所以博主采某清叶压过育识银用ajax来进行boa服务器下的异步通信。

主要实现及踩过的坑如下:

1.get还是post请求:怎么发请求参见W3School上的ajax教程

推荐一般人没有前端基础的人使用get请求,因为只需要在请求的参数做一个财曲杆血经妈七始字符串拼接就可以完成基本的ajax请求,具体实现可以参照一下这个网址(http://blog.csdn.net/huguohu2006/article/details/7755107),接下来重点讲一下post请求,优势这里我就不多讲了,前面的教程里面都有,主要讲一下实现方式:

functionsender(url,data){varxhr=createXh**R();if(xhr){xhr.onreadystatechange缺黄失者罗更与职们补=function(){if(xhr.readyState==4&&xhr.status==200){console.log(xhr.responseText);console.log(xhr.responseText.toString希敌此帝破质每首企族当());varretur处nValue=xhr.responseText.toString();console.log(returnValue);returnreturnValue;//firefox下xhr.responseText作为返回值失效的问题//ie可以利用return世控肉八视来得到值。但fir适绝最型连内吗著太雷efox则不能,只能在readyState==4&&status==200时处理一个函数//这个函数应当作为一个参数传递入函数。有个奇怪现象你如果去除红线部分的注释,firefox又可以取到值。//估计是firefox使用ajax取值有个延时造成。//returnxhr.responseText.toString();}元};***.open("post",url,true);//send(string)仅适用于post请求xhr.send(data);}else{//XMLh**ttpRequest对象创建失败alert("浏览器不支持,请更换浏览器!");}}

利用调用sender活深业流答印酒题察北危函数来实现ajax,函数的两个参数分别是请求的url和要发送的**,注意post请求只能发送string类型的**。如果要发送其他类型的**建议采用jqu和夜愿急积ery封装的ajax方法,这里之所以采用原生的ajax方法来发送**主要有以下几个原因:

•jquery库的体积比较大,有可能mount进开发箱上的li**x系统时出现失败的情况,这种情况可以通过mountu盘的方式解决mountu盘的命令如下:mount-r/dev/uba4/web-r为mount进文件的读写权限,具体可执行搜索查询,ub宪明定磁无功史a4为U盘在li**x系统上显示的名字,web为目标文件夹,使用U盘挂载的缺点在于整个U盘的文件会全部被复制到目标庆事北养他南抓职复文件夹中,有点缀余

•发送的什光零妒总温乡**不很多,也没有其他的类型要求,使用string类型完全可以满足开发需求,没必要引入jquery库增加项目空间

•原生的ajax可以更好地解释http请求的原理

下面再介绍一下cgi文件对http请求的处理,示例函如下:

#include<stdlib.h>#in层交剂五感快留规算系海clude<stdio.h>#include<strin居诗括温用拿民吃停望g.h>char*get_杆比部华物错群cgi_data(FILE*fp,char*method){char*input;intlen;intsize=1024;inti=0;if(strcmp(method,"GET")==0)/**<GETmethod*/{input=getenv("QUERY_STRING");returninput;}elseif(strcmp(method,"POST")==0)/**<POSTmethod*/{len=atoi(getenv("CONTENT_LENGTh**"));input=(char*)malloc(sizeof(char)*(size+1));if(len==0){input[0]='\0';returninput;}while(1){input[i]=(char)fgetc(fp);if(i==size){input[i+1]='\0';returninput;}--len;if(feof(fp)||(!(len))){i++;input[i]='\0';returninput;}i++;}}return**LL;}intmain(void){char*input;char*method;charname[64];charpasswd[64];inti=0;intj=0;printf("Content-type:text/html\n\n");printf("Thefollowingisqueryresult:");method=getenv("REQUEST_METh**OD");input=get_cgi_data(stdin,method);printf("stringis:%s",input);return0;}

上面包含了c语言处理两种请求的方法,get请求比较简单,直接使用getenv("QUERY_STRING")就可以获取到请求发送的**,post请求的处理则比较负责,先获取请求内容长度,然后根据长度来动态分配一个等长的字符串空间,将发送的**传给字符串,然后再根据自己项目的需要进行相应的处理即可。

PS:发送http请求时对应的成功程序printf之后就是http请求接受到的相应,也就是对应的xhr的responseText属性值,另外.c文件需要理由arn-li**x-gcc-ohelloworld.cgihelloworld.c命名交叉编译得到对应的.cgi文件。然后博主用的是在每一次请求成功之后继续发送下一次请求,因为如果直接使用setInterval函数进行循环请求传感器**的话会**生比较大的延时,基本等同于进程,如果直接通过文件存储传感器**的方式则可以使用setInterval函数。

以上所述是小编给大家介绍的Boa服务器下的ajax与cgi通信的全部叙述,希望对大家有所帮助,如果大家想了解更多内容敬请关注脚本之家!