Nodejs使用post发送请求与批量发送请求

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qqHJQS/article/details/51786485

使用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回调函数会对此有很大的帮助!

代码下载

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页