我已经尝试the sample from the documentation了,效果很好。
但是当我将网址更改为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 --sslv3 https://api.mercadolibre.com/sites/有效。 我在centos 6中测试过同样的功能。 我重新安装了节点,这次来自源,同样的问题。我的Os是ubuntu 12.04。 感谢。
答案 0 :(得分:7)
我不确定api.mercadolibre.com
网站,但如果删除port
param,我可以调用API,如下面的代码:
var options = {
host: 'api.mercadolibre.com',
path: '/sites/',
method: 'GET'
};
我们还需要添加param来支持SSL版本3:
https.globalAgent.options.secureProtocol = 'SSLv3_method';
答案 1 :(得分:3)
由于它正在使用curl,请尝试使用node-curl模块。我失去了一整天试图使用http和/或https模块在node.js中工作,直到我切换到node-curl。
试试这个:
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);
});
答案 2 :(得分:2)
为什么不使用像request这样的库来处理您的详细信息?
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"}]
答案 3 :(得分:1)
相同,使用curl但不使用node.js。
问题:这里使用CentOS-5 curl usesthe提供openssl库,因此使用centos standard /etc/pki/tls/certs/ca-bundle.crt进行CA检查。
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);
答案 4 :(得分:0)
我认为您是需要指定请求的代理服务器。 libcurl自动检测代理设置,node-curl使用该设置。因此,请求传递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);
}
})
答案 5 :(得分:0)
如果您这样做,您将收到ECONNRESET错误:
post_options.path = 'history';
...
var req = http.request(post_options, function(res) {
...
也就是说,你需要确保你的路径有这样的 / :
post_options.path = '/history';
...