Boa服務(wù)器下的ajax與cgi通信
最近在最有做一個(gè)嵌入式課程設(shè)計(jì),要求是利用基于cortax a8的物聯(lián)網(wǎng)實(shí)驗(yàn)箱做一個(gè)簡(jiǎn)單的嵌入式網(wǎng)頁(yè)交互系統(tǒng)作為課程設(shè)計(jì)來(lái)驗(yàn)收評(píng)分。因?yàn)楸旧碜约菏菍W(xué)前端的,所以網(wǎng)頁(yè)部分并不是重點(diǎn),主要是和boa服務(wù)器之間的通信,課程實(shí)驗(yàn)給的例子是直接使用printf來(lái)打印html標(biāo)簽形成新的頁(yè)面,有過(guò)前端開(kāi)發(fā)經(jīng)驗(yàn)的人都知道這種做法效率低下而且沒(méi)有辦法實(shí)現(xiàn)異步刷新,所以博主采用ajax來(lái)進(jìn)行boa服務(wù)器下的異步通信。
主要實(shí)現(xiàn)及踩過(guò)的坑如下:
1. get 還是 post請(qǐng)求:怎么發(fā)請(qǐng)求參見(jiàn)W3School上的ajax教程
推薦一般人沒(méi)有前端基礎(chǔ)的人使用get請(qǐng)求,因?yàn)橹恍枰谡?qǐng)求的參數(shù)做一個(gè)字符串拼接就可以完成基本的ajax請(qǐng)求,具體實(shí)現(xiàn)可以參照一下這個(gè)網(wǎng)址(http://blog.csdn.net/huguohu2006/article/details/7755107),接下來(lái)重點(diǎn)講一下post請(qǐng)求,優(yōu)勢(shì)這里我就不多講了,前面的教程里面都有,主要講一下實(shí)現(xiàn)方式:
function sender(url, data) { var xhr = createXHR(); if (xhr) { xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { console.log(xhr.responseText); console.log(xhr.responseText.toString()); var returnValue = xhr.responseText.toString(); console.log(returnValue); return returnValue; // firefox下xhr.responseText作為返回值失效的問(wèn)題 // ie可以利用return來(lái)得到值。但firefox則不能,只能在readyState == 4 && status == 200時(shí)處理一個(gè)函數(shù) // 這個(gè)函數(shù)應(yīng)當(dāng)作為一個(gè)參數(shù)傳遞入函數(shù)。有個(gè)奇怪現(xiàn)象你如果去除紅線(xiàn)部分的注釋?zhuān)琭irefox又可以取到值。 // 估計(jì)是firefox使用ajax取值有個(gè)延時(shí)造成。 //return xhr.responseText.toString(); } }; xhr.open("post", url, true); // send(string) 僅適用于post請(qǐng)求 xhr.send(data); } else { //XMLHttpRequest對(duì)象創(chuàng)建失敗 alert("瀏覽器不支持,請(qǐng)更換瀏覽器!"); } }
利用調(diào)用sender函數(shù)來(lái)實(shí)現(xiàn)ajax,函數(shù)的兩個(gè)參數(shù)分別是請(qǐng)求的url和要發(fā)送的數(shù)據(jù),注意post請(qǐng)求只能發(fā)送string類(lèi)型的數(shù)據(jù)。如果要發(fā)送其他類(lèi)型的數(shù)據(jù)建議采用jquery封裝的ajax方法,這里之所以采用原生的ajax方法來(lái)發(fā)送數(shù)據(jù)主要有以下幾個(gè)原因:
•jquery庫(kù)的體積比較大,有可能mount進(jìn)開(kāi)發(fā)箱上的linux系統(tǒng)時(shí)出現(xiàn)失敗的情況,這種情況可以通過(guò)mount u盤(pán)的方式解決 mount u盤(pán)的命令如下: mount -r /dev/uba4 /web -r為mount進(jìn)文件的讀寫(xiě)權(quán)限,具體可執(zhí)行搜索查詢(xún),uba4為U盤(pán)在linux系統(tǒng)上顯示的名字,web為目標(biāo)文件夾,使用U盤(pán)掛載的缺點(diǎn)在于整個(gè)U盤(pán)的文件會(huì)全部被復(fù)制到目標(biāo)文件夾中,有點(diǎn)綴余
•發(fā)送的數(shù)據(jù)不很多,也沒(méi)有其他的類(lèi)型要求,使用string類(lèi)型完全可以滿(mǎn)足開(kāi)發(fā)需求,沒(méi)必要引入jquery庫(kù)增加項(xiàng)目空間
•原生的ajax可以更好地解釋http請(qǐng)求的原理
下面再介紹一下cgi文件對(duì)http請(qǐng)求的處理,示例函如下:
#include <stdlib.h> #include <stdio.h> #include <string.h> char* get_cgi_data(FILE* fp, char* method) { char* input; int len; int size=1024; int i=0; if (strcmp(method, "GET") == 0) /**< GET method */ { input = getenv("QUERY_STRING"); return input; } else if (strcmp(method, "POST") == 0) /**< POST method */ { len = atoi(getenv("CONTENT_LENGTH")); input = (char*)malloc(sizeof(char) * (size+1)); if (len == 0) { input[0] = '\0'; return input; } while (1) { input[i] = (char)fgetc(fp); if (i == size) { input[i+1] = '\0'; return input; } --len; if (feof(fp) || (!(len))) { i++; input[i] = '\0'; return input; } i++; } } return NULL; } int main(void) { char* input; char* method; char name[64]; char passwd[64]; int i=0; int j=0; printf("Content-type:text/html\n\n"); printf("The following is query result:"); method = getenv("REQUEST_METHOD"); input = get_cgi_data(stdin, method); printf("string is: %s", input); return 0; }
上面包含了c語(yǔ)言處理兩種請(qǐng)求的方法,get請(qǐng)求比較簡(jiǎn)單,直接使用getenv("QUERY_STRING")就可以獲取到請(qǐng)求發(fā)送的數(shù)據(jù),post請(qǐng)求的處理則比較負(fù)責(zé),先獲取請(qǐng)求內(nèi)容長(zhǎng)度,然后根據(jù)長(zhǎng)度來(lái)動(dòng)態(tài)分配一個(gè)等長(zhǎng)的字符串空間,將發(fā)送的數(shù)據(jù)傳給字符串,然后再根據(jù)自己項(xiàng)目的需要進(jìn)行相應(yīng)的處理即可。
PS:發(fā)送http請(qǐng)求時(shí)對(duì)應(yīng)的成功程序printf之后就是http請(qǐng)求接受到的相應(yīng),也就是對(duì)應(yīng)的xhr的responseText屬性值,另外.c文件需要理由arn-linux-gcc -o helloworld.cgi helloworld.c命名交叉編譯得到對(duì)應(yīng)的.cgi文件。然后博主用的是在每一次請(qǐng)求成功之后繼續(xù)發(fā)送下一次請(qǐng)求,因?yàn)槿绻苯邮褂胹etInterval函數(shù)進(jìn)行循環(huán)請(qǐng)求傳感器數(shù)據(jù)的話(huà)會(huì)產(chǎn)生比較大的延時(shí),基本等同于進(jìn)程,如果直接通過(guò)文件存儲(chǔ)傳感器數(shù)據(jù)的方式則可以使用setInterval函數(shù)。
以上所述是小編給大家介紹的Boa服務(wù)器下的ajax與cgi通信的全部敘述,希望對(duì)大家有所幫助,如果大家想了解更多內(nèi)容敬請(qǐng)關(guān)注腳本之家!
- 模擬jQuery ajax服務(wù)器端與客戶(hù)端通信的代碼
- Ajax 通過(guò)城市名獲取數(shù)據(jù)(全國(guó)天氣預(yù)報(bào)API)
- 通過(guò)數(shù)據(jù)庫(kù)和ajax方法寫(xiě)出地圖的實(shí)例代碼
- 在Thinkphp中使用ajax實(shí)現(xiàn)無(wú)刷新分頁(yè)的方法
- jQuery中ajax的4種常用請(qǐng)求方式介紹
- jstree創(chuàng)建無(wú)限分級(jí)樹(shù)的方法【基于ajax動(dòng)態(tài)創(chuàng)建子節(jié)點(diǎn)】
- Ajax與服務(wù)器(JSON)通信實(shí)例代碼
相關(guān)文章
SpringMVC環(huán)境下實(shí)現(xiàn)的Ajax異步請(qǐng)求JSON格式數(shù)據(jù)
這篇文章主要介紹了SpringMVC環(huán)境下實(shí)現(xiàn)的Ajax異步請(qǐng)求JSON格式數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-05-05javascript 拖動(dòng)_cookie_ajax等
比較實(shí)用的js拖動(dòng)效果代碼。類(lèi)的寫(xiě)法不錯(cuò),是個(gè)不錯(cuò)的應(yīng)用2008-06-06使用AJAX(包含正則表達(dá)式)驗(yàn)證用戶(hù)登錄的步驟
這篇文章主要介紹了使用AJAX(包含正則表達(dá)式)驗(yàn)證用戶(hù)登錄的步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Ajax異步提交數(shù)據(jù)返回值的換行問(wèn)題實(shí)例分析
這篇文章主要介紹了Ajax異步提交數(shù)據(jù)返回值的換行問(wèn)題,結(jié)合實(shí)例形式較為詳細(xì)的分析了ajax異步提交過(guò)程中返回值帶有換行的處理技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Ajax異步請(qǐng)求的五個(gè)步驟及實(shí)戰(zhàn)案例
通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新,下面這篇文章主要給大家介紹了關(guān)于Ajax異步請(qǐng)求的五個(gè)步驟及實(shí)戰(zhàn)案例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08強(qiáng)烈推薦 - Ajax 技術(shù)資源中心
強(qiáng)烈推薦 - Ajax 技術(shù)資源中心...2007-05-05ASP.NET與Ajax的實(shí)現(xiàn)方式小總結(jié)
Ajax 應(yīng)該不是一項(xiàng)技術(shù),是一種思想而已,跟 ASP.NET 以及其它 Web 開(kāi)發(fā)語(yǔ)言沒(méi)有什么太大關(guān)系,這里只是談?wù)?ASP.NET 中目前使用的 Ajax 技術(shù)以及其它一些實(shí)現(xiàn) Ajax 的優(yōu)秀框架。感興趣的朋友跟著小編一起學(xué)習(xí)asp.net與ajax的實(shí)現(xiàn)方式2015-09-09ajax實(shí)現(xiàn)城市三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了ajax實(shí)現(xiàn)城市三級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10