8

ドキュメントのサンプルを試してみましたが、うまく機能しています。

しかし、URLをに変更するhttps://api.mercadolibre.com/sites/と、リクエストがハングします。私が得る唯一のものは:

{ [Error: socket hang up] code: 'ECONNRESET' }

これが私のコードです:

var https = require('https');

this.dispatch = function(req, res) {
  var renderHtml = function(content) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(content, 'utf-8');
  }

  var parts = req.url.split('/');

  var options = {
    host: 'api.mercadolibre.com',
    port: 443,
    path: '/sites/',
    method: 'GET'
  };

  var request = https.request(options, function(res) {
    console.log("statusCode: ", res.statusCode);
    console.log("headers: ", res.headers);

    res.on('data', function(d) {
      process.stdout.write(d);
    });
  });

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

  request.end();
  return 'item id:' + parts[2];
};

私はcurl、soapui、そしてブラウザで試しました。すべての場合でうまく機能しますが、node.jsでは機能しません。

何が起こっているかについて、どうすればより多くのデータを取得できますか?

追加した

curlを使用すると、次のようになります。curl--sslv3https://api.mercadolibre.com/sites/は機能します。私はcentos6で同じことをテストし、動作します。今回はソースからノードを再インストールしましたが、同じ問題が発生します。私のOSはubuntu12.04です。ありがとう。

4

6 に答える 6

7

サイトについてはわかりませんが、次のコードのように、paramapi.mercadolibre.comを削除すると API を呼び出すことができます。port

var options = {
    host: 'api.mercadolibre.com',
    path: '/sites/',
    method: 'GET'
};

また、SSL バージョン 3 をサポートするには、param も追加する必要があります。

https.globalAgent.options.secureProtocol = 'SSLv3_method';
于 2012-11-27T16:57:25.680 に答える
3

curlで動いているので、node-curlモジュールを使ってみてください。node-curlに切り替えるまで、httpおよび/またはhttpsモジュールを使用してnode.jsで機能させようとして丸一日を失いました。

これを試して:

var curl = require('node-curl');
curl('https://api.mercadolibre.com/sites/', {SSLVERSION: 3}, function(err, res) {
    var body = res.body;
    res.close();
    console.log(body);
});
于 2012-11-04T03:53:52.140 に答える
3

ライブラリのようなリクエストを使用して詳細を処理してみませんか?

var request = require('request');

request('https://api.mercadolibre.com/sites/', {}, function(err, res, body) {
  console.log("Got body: ", body);
});

これにより、次の結果が得られます。

Got body:  [{"id":"MLA","name":"Argentina"},{"id":"MLB","name":"Brasil"},{"id":"MCO","name":"Colombia"},{"id":"MCR","name":"Costa Rica"},{"id":"MEC","name":"Ecuador"},{"id":"MLC","name":"Chile"},{"id":"MLM","name":"Mexico"},{"id":"MLU","name":"Uruguay"},{"id":"MLV","name":"Venezuela"},{"id":"MPA","name":"Panamá"},{"id":"MPE","name":"Perú"},{"id":"MPT","name":"Portugal"},{"id":"MRD","name":"Dominicana"}]
于 2012-05-27T06:45:40.963 に答える
1

ここでも同じです。curl を使用しますが、node.js は使用しません。

問題: ここ CentOS-5 では、curl は openssl ライブラリを提供するため、CA チェックに centos 標準の /etc/pki/tls/certs/ca-bundle.crt を使用します。

node.js はどこを探しますか? strace を介して、チェック用の CA ファイルへの参照が表示されません。よく知られている古い発行者からの有効な SSL 証明書を持つサーバーに対する Node.js 要求は受け入れられますが、独自の CA を持つ自分の Web サーバーに対するものではありません。独自の CA.crt を ca-bundle.crt ファイルに入れたため、curl はそれを受け入れますが、node.js は受け入れません。

今のところ唯一の解決策は、開発ボックスの検証チェックを無効にすることです。

    var client = require('https');
    var download_options = url.parse(sourceUrl);
    download_options.method = "GET";
    download_options.agent = false;
    download_options.rejectUnauthorized = false; / HERE to accept all SSL-certificates */

    var download_request = client.request(download_options);
于 2013-07-09T17:02:12.227 に答える
0

リクエストするために指定する必要があるプロキシの背後にいると思います。プロキシ設定は、node-curl が使用する libcurl によって自動的に検出されます。したがって、リクエストは node-curl で渡されます。

したがって、組織が使用するプロキシ IP とポートを見つけて、これを試してください。

var request = require('request');
request({
    uri : 'https://mail.google.com/mail',
    proxy : 'http://<proxy ip>:<proxy port>'
}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body) // Print the google web page.
    }else{
        console.log(error);
        console.log(response.statusCode);
    }
})
于 2012-07-11T10:10:33.603 に答える
0

これを行うと、ECONNRESET エラーが発生します。

post_options.path = 'history';
...
var req = http.request(post_options, function(res) {
...

つまり、パスが次の/ようになっていることを確認する必要があります。

post_options.path = '/history';
...
于 2013-10-21T20:13:13.643 に答える