使用nodejs无论是搭建服务端还是发送请求都是非常的容易,简单几行代码就能搞定服务端如:
var http = require("http");
http.createServer(function(request, response) {
console.log('request received');
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
console.log('server started');
然后网址输入http://localhost:8888/ 就可以看到’Hello World’这让做web开发的我抓狂了好久!!!
这里要讲的是使用post发送请求,和批量发送请求!
1、post
使用nodejs的http模块来完成post请求,函数为
http.request(options, callback)#
options可配置的参数如下:
- host:请求发送到的服务器的域名或IP地址。默认为’localhost’
- hostname:用于支持url.parse()。hostname比host更好一些
- port:远程服务器的端口。默认值为80。
- localAddress:用于绑定网络连接的本地接口。
- socketPath:Unix域套接字(使用host:port或socketPath)
- method:指定HTTP请求方法的字符串。默认为’GET’。
- path:请求路径。默认为’/’。如果有查询字符串,则需要包含。例如’/index.html?page=12’。请求路径包含非法字符时抛出异常。目前,只否决空格,不过在未来可能改变。
- headers:包含请求头的对象。
- auth:用于计算认证头的基本认证,即’user:password’
- agent:控制Agent的行为。当使用了一个Agent的时候,请求将默认为Connection: keep-alive。可能的值为:
- undefined(默认):在这个主机和端口上使用[全局Agent][]。
- Agent对象:在Agent中显式使用passed。
- false:在对Agent进行资源池的时候,选择停用连接,默认请求为:Connection: close。
- keepAlive:{Boolean} 保持资源池周围的套接字在未来被用于其它请求。默认值为false
- keepAliveMsecs:{Integer} 当使用HTTP KeepAlive的时候,通过正在保持活动的套接字发送TCP KeepAlive包的频繁程度。默认值为1000。仅当keepAlive被设置为true时才相关。
不要怕,实际上用到的没有这么多,我在本地建立了一个简单web项目,node这边需要的option选项如下:
var options = {
host:'localhost',
port:8080,
path:'/qfxt/nbg/recevie',
method:'POST',
headers:{
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36',
'Content-Type' : 'application/x-www-form-urlencoded',// 不写这个参数,后台会接收不到数据
'Content-Length' : post_data.length
}
};
注意:headers里面一定要配置‘Content-Type’和‘Content-Length’这两个参数,切记切记!安全起见type最好为‘application/x-www-form-urlencoded’。
接下来使用回调函数来检测请求的状态和头部等等
var req = http.request(options,function(res){
console.log('STATUS:' + res.statusCode);
console.log('HEADERS:' + JSON.stringify(res.headers));
res.setEncoding('utf-8');
res.on('data',function(body){
console.log('BODY:' + body);
});
res.on('end',function(){
//请求结束
console.log('end');
});
res.on('error',function(e){
if(e){
console.info(e);
}
})
});
//post方法里
req.write(post_data,'utf-8');
req.end();
在req.end()之前将参数写进req里,使用res监听‘data’事件来获取响应的消息体,这里我另外监听了两个事件‘end’、‘err’,结束和错误事件,因为request()属于异步,想在请求结束后操作另一件事,就要在data或end事件里写,如果请求过程中发生一些意料之外的错误,将会在err事件中打印出来。
2、批量发送请求
上一篇博客里讲到,我监听一个文本文件,将文件已有的内容解析出来发送给服务器,文件内容我解析出来放在一个数组里,本打算通过循环发送请求,由于request()属于异步操作,是不能使用循环来处理的,网上有推荐第三方库的,我看了一些,感觉好麻烦,后来使用递归的办法来实现同步。方案就是在end执行下一个请求,加个标记,如果下标等于数组的长度或越界直接返回,结束递归,实现如下:
function postFun(index){
if(index >= array.length)return;
var currParam = array[index];
var req = http.request(options,function(res){
console.log('STATUS:' + res.statusCode);
console.log('HEADERS:' + JSON.stringify(res.headers));
res.setEncoding('utf-8');
res.on('data',function(body){
console.log('BODY:' + body);
});
res.on('end',function(){
postFun(index + 1);
})
});
req.on('err',function(err){
if(e){
console.info(e);
}
});
// 参数
console.log(currParam);
req.write(currParam,'utf-8');
req.end();
}
postFun(0);
这样就完美解决了批量请求异步的问题。
通过这种写法就会很快的解决一些有关批量处理异步的问题!
关于nodejs的异步编程是有时喜来有时忧,了解nodejs回调函数会对此有很大的帮助!