0

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 イベントは決して発生しません。エラーなし。リクエストは正しく行われているように見えますが、ヘッダー "content-type":"application/json; charset=utf-8" で 200 が返されます。では、なぜボディ/チャンクがないのでしょうか? リクエスト メソッドは、ここで curl が行うこととは異なることをしますか? 私が知る限り、これらはまったく同じ要求であるはずです。

トラブルシューティング中に、POST vars をエコーバックする簡単な PHP スクリプトを作成します。代わりにこのコードをそのスクリプトに向けると、問題なく動作しました。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);
    });

ありがとう!

4

1 に答える 1

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')
})
于 2013-04-09T02:12:49.757 に答える