块事件永远不会在https请求中触发

时间:2013-04-08 21:56:23

标签: node.js

我正在测试一些API调用(Splunk)。当我用curl进行调用时,它按预期工作。

curl -k -v -u admin:password -d 'search=search error | head 10' -d "output_mode=json"     https://192.168.50.16:8089/servicesNS/admin/search/search/jobs/export

这样可以正常工作并返回一个包含json结果数组的主体。

但是当我尝试从我的节点应用程序发出相同的请求时,我没有任何身体。在下面的代码中,on chunk事件永远不会触发。没有错误;请求似乎正确,我得到一个200回来与标题“内容类型”:“application / json; charset = utf-8”。那么为什么没有身体/大块呢?请求方法在这里做的不同于curl会做什么吗?据我所知,这些应该是完全相同的请求。

在进行故障排除时,我制作了一个快速的PHP脚本,它回显了POST变量。当我将该代码指向该脚本时,它工作得很好 - 我用PHP输出回来了。所以我只想弄清楚为什么API可能正确响应来自curl的请求,而不是来自node.js的请求。有什么想法吗?

    var https = require('https');
    var querystring = require('querystring');
    var data = { output_mode:'json', search: 'search error | head 10' };
    var datastring = querystring.stringify(data);

    var headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': datastring.length
    };

    var options = {
        hostname: '192.168.50.16',
        port: 8089,
        path: '/servicesNS/admin/search/search/jobs/export',
        method: 'POST',
        auth: 'admin:password',
        headers: headers
    };

    var theRequest = https.request(options, function(api_response) {
        var responsedata = '';
        api_response.on('data', function(chunk) {
            console.log('got a chunk');
            responsedata += chunk;
        });

        api_response.on('end', function () {
            callback(true, responsedata);
        });
    });

    theRequest.write(datastring);

    theRequest.end();
    theRequest.on('error', function(e) {
        console.error(e);
    });

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试使用request模块。它使得在节点中更容易使用http(s)。请查看下面的示例,看看您是否从服务器获得任何响应

var request = require('request')
var postData = { output_mode:'json', search: 'search error | head 10' };

var options = {
    url: 'https://192.168.50.16:8089/servicesNS/admin/search/search/jobs/export',
    method: 'POST',
    auth: {
      user: 'admin',
      pass: 'password',
    },
    form: postData
};
var r = request(options, function(err, res, body) {
   if (err) {
      console.dir(err)
      return
   }
   console.dir('status code', res.statusCode)
   console.dir(body)
})

您还可以管道请求并侦听数据事件

var options = ... // look above
var r = request(options)
r.on('data', function(data) {
   console.log('request data received')
})