NodeJS系列~第四个小例子,NodeJs处理Get请求和Post请求
说在前
对于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(, {
'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(, "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(, {
"Content-Type": "text/plain;charset=utf-8"
});
res.end("数据提交完毕");
});
}).listen(, "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();
}
下面看一下结果,我把它截了图:
aaarticlea/png;base64,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" alt="" />
实事上,对于post到nodeJS再由nodeJS到redis,这个case我们经常会看到,它实现起来比IIS,apache在性能上要高很多,它没有为每个连接建立线程,它解决了IO阻塞等等,OK,说到这里,我再强调一个nodeJS用到的最重要的场合:逻辑简单的高并发场合!
下一次,我将为大家带来NodeJS实现文件上传的功能,敬请关注!
NodeJS系列~第四个小例子,NodeJs处理Get请求和Post请求的更多相关文章
- NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储
返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...
- NodeJS系列~目录
回到占占推荐博客索引 Node.js官网对它的阐述 Node.js is a platform built on Chrome's JavaScript runtime for easily buil ...
- [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()
译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...
- nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId
nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId 前言: 我准备用nodejs+koa+uniapp实现一款餐饮点单小程序,以及nodejs+koa+vue实现后端管理 ...
- NodeJS系列-部署
NodeJS系列-部署 NodeJS我就不介绍了,被标题吸引进来的人可以看这个链接,了解NodeJS.下来就开始关于NodeJS开发的指南. NodeJS可以部署的平台有Windows,Unix,iO ...
- c/c++ 模板与STL小例子系列<三> traits
c/c++ 模板与STL小例子系列 traits 对这个概念,还是处于懵逼的状态,初步体会就是,为了解决类型之间的转换问题. 从一个类型为A的指针,转化到类型为B的指针,中间需要用void*来作为中介 ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- c/c++ 模板与STL小例子系列<一 >自建Array数组
c/c++ 模板与STL小例子系列 自建Array数组 自建的Array数组,提供如下对外接口 方法 功能描述 Array() 无参数构造方法,构造元素个数为模板参数个的数组 Array(int le ...
- nodejs取参四种方法req.body,req.params,req.param,req.body
摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现. 获取 ...
随机推荐
- Unity3D将来时:WebGL
作者:小玉链接:https://zhuanlan.zhihu.com/p/19974794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 随着Unity5.0的发布,W ...
- 验证radio 是否被选中
var radioType=document.getElementsByName("radioType"); var isCheckRadio=false; for(v ...
- CodeForces 743A Vladik and flights (水题)
题意:sb要从a到b,然后要乘坐飞机,只有两家有飞机,如果乘坐同一家的,就免费,如果不是就收到abs(j-i) 的费用,问你最少花费是多少. 析:直接考虑a和b是不是同一家的,如果是,花费为0,如果不 ...
- Spring绑定表单数据
Spring提供了一些jsp页面常用的form标签,很大程度上提高了我们开发的速度,不用再一个个的标签去绑定属性,而且后台接收数据也很简单,可以直接接收object对象作为属性.官方form标签介绍的 ...
- unity3d多线程坑
单独起了一个线程来处理网络相关操作,比较常规的做法.本身没啥特别的东西,碰到了一个不大不小的坑折腾了好久,记录下来吧. 简单的说就是子线程中抛出的异常,如果没有catch的话,会导致子线程悄无声息的退 ...
- Android密码约束规则例子一
Android常用的一个密码规则 (一)密码必须是8至16位:(二)密码必须包含英文字母和数字:(三)密码不能包含4位连续相同的字符,如0000或AAAA:(四)密码不能包含4位连续递增或连续递减的数 ...
- ASP.NET Web服务调用发生错误,错误代码404
现象: iOS端使用ASIHTTP连接Web服务时,得到的数据是一个错误代码为404的页面,错误信息(web.config添加<customErrors mode="Off" ...
- .NET相关操作其他文件的小程序(系列文章)
平时自诩为使用.NET做开发,但是实际上从一开始学习C#直到现在除了做个几个不登大雅之堂的小网站,做过几个winform程序和几个控制台应用程序,真的没有踏踏实实地用.NET开发过某些属于自己的东西. ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- Linux环境下解压超过4GB的zip文件
今天在Linux服务器中解压一个zip的压缩包,提示如下错误信息: [root@appsrv01 ZIP_BCSA_COURSES]# unzip BCSA_MEDIAS_BAK_20161118.z ...