一、HTTP客户端向其他网站请求数据
在node.js中,我们可以轻松的向任何网站发送请求并读取该网站的响应数据:
在http模块中,我们可以使用Request方法向服务器(其他网站)请求数据。Request方法的使用方式如下:
var req = http.request(opts,callback);
我们注意到在request方法中有两个参数,其中opts参数为一个对象或者字符串,用于指定请求的目标url地址。如果opts参数值为一个字符串,将自动使用url模块中的parse方法转换为一个对象。其中opts参数值或者使用parse方法转换后的对象中,可以指定的属性有:
- host: 用于指定域名或者目标主机的IP地址,默认的为localhost
- hostname: 与host属性值相同,但是如果host和hostname的值都被绑定,那么将会优先使用hostname
- port: 指定目标服务器用于HTTP客户端连接的端口号
- localAddress:用于指定专用于网络连接的本地端口
- socketPath:用于指定目标UNix域端口
- method:用于指定HTTP请求方法,,默认属性值为get
- path:用于指定请求路径及查询字符串,默认属性值为”/“
- headers:用于指定客户端请求头对象
- auth:用来指定认证信息部分
- agent:用于指定HTTP代理
headers = {
'Content-Type': 'application/json',
'Content-Length': reqBodyStr.length
};
options = {
host: 'localhost',
port: 4000,
path: path,
method: 'GET',
headers: headers
};
internalReq = http.request(options, function (newRes) {
newRes.setEncoding('utf-8');
var responseString = '';
newRes.on('data', function (data) {
responseString += data;
});
newRes.on('end', function () {
try {
var resultObject = JSON.parse(responseString);
//console.log(resultObject);
next(resultObject);
//res.send(resultObject);
}catch (e){
//res.send('error');
}
});
});
internalReq.on('error', function (e) {
});
internalReq.write(reqBodyStr);
internalReq.end();
其中,
newRes.on('data', function (data) {
responseString += data;
});
客户端接收到数据 ;
newRes.on('end', function () {
});
服务端结束响应。
二、制作代理服务器
制作代理服务器的大概流程为:
首先创建一个HTTP服务器,当服务器接收到客户端请求后,向 被代理网站(www.baidu.com)请求数据,接收到数据之后将响应数据发送给客户端。
server = http.createServer(function(sreq,sres) {
url_parts = url.parse(sreq.url);
options = {
host:'www.baidu.com',
port:80,
path:url_parts.pathname,
headers: sreq.headers
};
creq = http.get(options,function(cres) {
sres.writeHead(cres.statusCode,cres.headers);
cres.pipe(sres);
});
sres.pipe(creq);
});
server.listen(3000,'127.0.0.1');
上述代码便实现了代理服务器。