NodeJS系列~第四個(ge)小例子(zi),NodeJs處理Get請(qing)求和Post請(qing)求
說在前
對(dui)于HTTP請求來說(shuo)(shuo),我(wo)(wo)們通常使用的(de)(de)是Get和Post,除(chu)(chu)此之(zhi)外(wai)還有put,delete等,而對(dui)于get來說(shuo)(shuo),比較lightweight,只是對(dui)字(zi)符串(chuan)的(de)(de)傳(chuan)輸,它會被添加(jia)到URL地(di)址里(li)(li),屬于URL的(de)(de)一部(bu)分,有時(shi),我(wo)(wo)們為(wei)了(le)安全和兼容性問題,URL地(di)址上的(de)(de)參(can)數會進行Url.Encode,有的(de)(de)瀏覽器已經(jing)帶我(wo)(wo)們做了(le)這些;而對(dui)于Post來說(shuo)(shuo),就(jiu)顯得重了(le)一些,它的(de)(de)數據以包的(de)(de)形式存在(zai),除(chu)(chu)了(le)可以有文(wen)本信息,還可以有二進制(zhi)文(wen)件(jian)流信息,這講(jiang)里(li)(li),我(wo)(wo)們主要說(shuo)(shuo)的(de)(de)是Post里(li)(li)的(de)(de)文(wen)本處理。
做在后
一 使用NodeJs實現對Get請求的(de)(de)處理,nodejs接入的(de)(de)形(xing)式為url?param1=zzl¶m2=male
var redis = require("redis"); var http = require('http'); var url = require("url"); var info = "通過HTTPGet方式(shi)成功加入隊列"; http.createServer(function (req, res) { var params = url.parse(req.url, true).query;//解釋url參數部分(fen)name=zzl&email=zzl@sina.com var client = redis.createClient(); client.lpush("topnews", params.info); res.writeHead(200, { 'Content-Type': 'text/plain;charset=utf-8' }); client.lpop("topnews", function (i, o) { console.log(o);//回(hui)調,所(suo)以info可能沒法得(de)到o的(de)值,就被res.write輸出(chu)了(le) }) client.quit(); res.write(info); res.end(); }).listen(8000, "127.0.0.1"); console.log('Server running at //127.0.0.1:8000/');
測試://127.0.0.1:8000?info=zzl
二 使用NodeJs實現(xian)對Post請求(qiu)的(de)處理(li),nodejs接入的(de)形式為{param1="zzl",param2="male"}
Post由于它的重量,所以不可能說接收就接收,它會存儲接入中和接入完成兩種狀態,兩種狀態對應著回調方法,即,當然數據處(chu)于接入中狀態時,處(chu)理一(yi)種流(liu)(liu)程(cheng);當數據接入完成(cheng)后,處(chu)理另一(yi)種流(liu)(liu)程(cheng)。
//接入中 req.addListener("data", function (postDataChunk) {}); //接(jie)收完成(cheng) req.addListener("end", function () {});
下(xia)面看一下(xia)完成的代碼:
var redis = require('redis'); var http = require('http'); var url = require("url"); var querystring = require("querystring"); http.createServer(function (req, res) { // 設置接收數據編碼格式(shi)為 UTF-8 req.setEncoding('utf-8'); var postData = ""; //POST & GET : name=zzl&email=zzl@sina.com // 數據塊(kuai)接收中 req.addListener("data", function (postDataChunk) { postData += postDataChunk; }); // 數(shu)據接(jie)收完畢,執(zhi)行回調函數(shu) req.addListener("end", function () { console.log('數(shu)據接收完畢'); var params = querystring.parse(postData);//GET & POST ////解釋表單數據部分{name="zzl",email="zzl@sina.com"} console.log(params); console.log(params["name"]); PushToRedis(params["name"]); res.writeHead(500, { "Content-Type": "text/plain;charset=utf-8" }); res.end("數(shu)據提交完畢"); }); }).listen(8000, "127.0.0.1"); console.log('Server running at //127.0.0.1:8000/'); //表單接(jie)收完(wan)成后,再處(chu)理redis部(bu)分 function PushToRedis(info) { var client = redis.createClient(); client.lpush("topnews", info); console.log("PushToRedis:" + info); client.lpop("topnews", function (i, o) { console.log(o);//回(hui)調,所(suo)以info可能沒法(fa)得到(dao)o的值,就被res.write輸(shu)出了 }) client.quit(); }
下面看(kan)一下結果,我把它截(jie)了圖:
實事上,對于post到nodeJS再由nodeJS到redis,這個case我們經常會看到,它實現起來比IIS,apache在性能上要高很多,它沒有為每個連接建立線程,它解決了IO阻塞等等,OK,說到這里,我再強調一個nodeJS用到的最重要的場合:邏輯(ji)簡單的高并發場合!
下一次,我將為大家(jia)帶來NodeJS實現文件上(shang)傳(chuan)的功能(neng),敬請關注!