如何用nodejs设置proxy进行https请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用nodejs设置proxy进行https请求相关的知识,希望对你有一定的参考价值。

在Web项目中,有时需要通过协议调取来自其他环境的数据。HTTPS是一种应用于安全数据传输的网络协议。我们都知道Ajax可以异步请求数据,但单单通过ajax无法实现跨域。采用一些其他方式需要根据不同的浏览器做相应处理,火狐,谷歌等和IE需要各自做相应判断,所以这种通过浏览器来解析数据虽然省略了数据的解压缩等处理,但是在有安全认证等情况下做跨域处理确比较困难。比如:IE的请求Header无法更改。这时通过Node请求并解析数据就显得比较简单了。如下是nodejs中通过https请求数据的全过程:

var https = require('https');
var zlib = require('zlib');

var post_data="………………";//请求数据
var reqdata = JSON.stringify(post_data);
var options =
   hostname: '10.225.***.***',
   port: '8443',
   path: '/data/table/list',
   method: 'POST',
   rejectUnauthorized: false,
   requestCert: true,
   auth: 'admin:123456************',
   headers:
       'username': 'admin',
       'password': '123456************',
       'Cookie': 'locale=zh_CN',
       'X-BuildTime': '2015-01-01 20:04:11',
       'Autologin': '4',
       'Accept-Encoding': 'gzip, deflate',
       'X-Timeout': '3600000',
       'Content-Type': 'Application/json',
       "Content-Length":reqdata.length
   
;
var req = https.request(options, function (res)
);
req.write(reqdata);
req.on('response', function (response)
   switch (response.headers['content-encoding'])
       case 'gzip':
           var body = '';
           var gunzip = zlib.createGunzip();
           response.pipe(gunzip);
           gunzip.on('data', function (data)
               body += data;
           );
           gunzip.on('end', function ()
               var returndatatojson= JSON.parse(body);
               req.end();
           );
           gunzip.on('error', function (e)
               console.log('error' + e.toString());
               req.end();
           );
           break;
       case 'deflate':
           var output = fs.createWriteStream("d:temp.txt");
           response.pipe(zlib.createInflate()).pipe(output);
           req.end();
           break;
       default:req.end();
           break;
   
);
req.on('error', function (e)
   console.log(new Error('problem with request: ' + e.message));
   req.end();
   setTimeout(cb, 10);
);

注:options,需要有请求数据的长度,options需要加上'Accept-Encoding': 'gzip, deflate',返回的数据需要判断是哪种压缩方式,然后解压缩获取到数据。gunzip的end事件里的returndatatojson即是获取的数据。

参考技术A 创建一个服务器,代码如下:创建一个服务器,代码如下:[javascript]viewplaincopyvarhttp=require('http');http.createServer(function(req,res))res.writeHeader(200,'Content-Type':'text/html');res.write('Node.js');res.end('HelloWorld');.listen(3000);console.log('HTTPserverislisteningatport3000');访问输入127.0.01:3000即可访问端口为代码中listen处输入的端口值。

以上是关于如何用nodejs设置proxy进行https请求的主要内容,如果未能解决你的问题,请参考以下文章

如何用iptables将透明代理请求重定向另一主机

如何用nodejs通过post发送multipart/form-data类型的http请求

如何用Fiddler抓取https

nodejs通过代理(proxy)发送http请求(request)

如何用nodejs开发爬虫程序?

nodejs通过代理(proxy)发送http请求(request)