zoukankan      html  css  js  c++  java
  • nodejs发起HTTPS请求并获取数据

    摘要:在网站中有时候需要跨域请求数据,直接用Ajax无法实现跨域,采用其他方式需要根据不同的浏览器做相应的处理。用Nodejs可以很好的解决这些问题,后台引用HTTPS模块,发送和返回的数据均为JSON对象,很方便对数据处理。

    在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即是获取的数据。

    鉴于写作能力有限,若有描述不当或明显错误的,欢迎指正!
  • 相关阅读:
    .net 第一次请求比较慢
    配置文件读取与修改
    关系型数据库设计
    dynamic动态类型的扩展方法
    软件测试作业(三)
    软件测试作业(二)
    软件项目管理作业(二)
    软件项目管理作业(一)
    软件测试作业(一)
    C#最后一次作业(暂定)
  • 原文地址:https://www.cnblogs.com/wonglu/p/5018351.html
Copyright © 2011-2022 走看看