說在前
對於HTTP請求來說,我們通常使用的是Get和Post,除此之外還有put,delete等,而對於get來說,比較lightweight,只是對字符串的傳輸,它會被添加到URL地址里,屬於URL的一部分,有時,我們為了安全和兼容性問題,URL地址上的參數會進行Url.Encode,有的瀏覽器已經帶我們做了這些;而對於Post來說,就顯得重了一些,它的數據以包的形式存在,除了可以有文本信息,還可以有二進制文件流信息,這講里,我們主要說的是Post里的文本處理。
做在后
一 使用NodeJs實現對Get請求的處理,nodejs接入的形式為url?param1=zzl¶m2=male
var redis = require("redis"); var http = require('http'); var url = require("url"); var info = "通過HTTPGet方式成功加入隊列"; http.createServer(function (req, res) { var params = url.parse(req.url, true).query;//解釋url參數部分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);//回調,所以info可能沒法得到o的值,就被res.write輸出了 }) client.quit(); res.write(info); res.end(); }).listen(8000, "127.0.0.1"); console.log('Server running at http://127.0.0.1:8000/');
測試:http://127.0.0.1:8000?info=zzl
二 使用NodeJs實現對Post請求的處理,nodejs接入的形式為{param1="zzl",param2="male"}
Post由於它的重量,所以不可能說接收就接收,它會存儲接入中和接入完成兩種狀態,兩種狀態對應着回調方法,即,當然數據處於接入中狀態時,處理一種流程;當數據接入完成后,處理另一種流程。
//接入中 req.addListener("data", function (postDataChunk) {}); //接收完成 req.addListener("end", function () {});
下面看一下完成的代碼:
var redis = require('redis'); var http = require('http'); var url = require("url"); var querystring = require("querystring"); http.createServer(function (req, res) { // 設置接收數據編碼格式為 UTF-8 req.setEncoding('utf-8'); var postData = ""; //POST & GET : name=zzl&email=zzl@sina.com // 數據塊接收中 req.addListener("data", function (postDataChunk) { postData += postDataChunk; }); // 數據接收完畢,執行回調函數 req.addListener("end", function () { console.log('數據接收完畢'); 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("數據提交完畢"); }); }).listen(8000, "127.0.0.1"); console.log('Server running at http://127.0.0.1:8000/'); //表單接收完成后,再處理redis部分 function PushToRedis(info) { var client = redis.createClient(); client.lpush("topnews", info); console.log("PushToRedis:" + info); client.lpop("topnews", function (i, o) { console.log(o);//回調,所以info可能沒法得到o的值,就被res.write輸出了 }) client.quit(); }
下面看一下結果,我把它截了圖:
實事上,對於post到nodeJS再由nodeJS到redis,這個case我們經常會看到,它實現起來比IIS,apache在性能上要高很多,它沒有為每個連接建立線程,它解決了IO阻塞等等,OK,說到這里,我再強調一個nodeJS用到的最重要的場合:邏輯簡單的高並發場合!
下一次,我將為大家帶來NodeJS實現文件上傳的功能,敬請關注!