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提供了四种方法来实现. 获取 ...
随机推荐
- jquery中是否加()的问题
自己总结的,慢慢修改再: 1带上()代表立即执行 去掉()代表当有事件发生的时候,我再执行
- 【动态规划】bzoj1642 [Usaco2007 Nov]Milking Time 挤奶时间
区间按左端点排序,dp. #include<cstdio> #include<algorithm> using namespace std; #define N 1001 st ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...
- 在 Mac OS 上使用 TypeScript 编写 ASP.NET Core 1.0 应用
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- <Android>文件下载
使用HTTP协议下载文件 创建一个URL对象 通过URL对象,创建一个HttpURLConnection对象 调用getInputStream()方法得到InputStream对象 从InputStr ...
- Json格式的字符串转换为正常显示的日期格式
//返回自定义格式日期: 2015-07-17 13:53:37function ChangeDateFormat(jsondate) { jsondate = jsondate.replace(&q ...
- jquery操作dom
1访问元素(属性,内容,值,css) 1元素属性(获取,设置,删除) .attr(name) .attr(key, value) || .attr({key0:value0, key1:value1 ...
- Hbase随笔2
Hbase是建立在HDFS上的分布式数据库,下图是Hbase表的模型: Hbase这个数据库其实和传统关系数据库还是有很多类似之处,而不是像mongodb,memcached以及redis完全脱离了表 ...
- for循环三个表达式的执行时间
for(int i = 0; i < max; i++) { //代码 } 第一个表达式:声明一个变量i,初始值为0,表示当前的循环次数:循环刚开始时执行第二个表达式:循环条件,如果i的值小于m ...
- css长度值与颜色值
颜色值 在网页中的颜色设置是非常重要的,有字体颜色,背景颜色,边框颜色等,设置颜色的方法也有很多种: 1.英文命令颜色 p{color:red;} 2.rgb颜色 p{color:rgb(133,45 ...