在node.js中调用https web服务(代理后)

4
我正在尝试从node.js调用https web服务。由于我在代理后面,因此我在选项中提供代理和端口以及凭据。但是我遇到了以下错误:
[Error: 2060:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol :openssl\ssl\s23_clnt.c:683: ]
以下是我尝试调用https web服务的代码片段:
var https = require('https'); 
var username = 'username';
var password = 'password';
var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
var data = '';
var options = { 
hostname: 'proxy', 
port: 8080, 
path: 'https://crm.zoho.com/crm/private/json/Leads/getMyRecords?authtoken=11111tsvs26677026bcba45ae3f&scope=crmapi',
headers: {
        "Proxy-Authorization" : auth
     }
};

console.log("options- " + JSON.stringify(options) + '\n');

var req = https.request(options, function(res) {

console.log("statusCode- " + res.statusCode);
console.log("headers-" + res.headers);

res.on('data', function(chunk) {
    data += chunk;
});

res.on('end', function (chunk) { 
    console.log('response-' + data);
});

});

req.end();

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

有人能帮我解决这个问题吗?

提前感谢, Manoj

1个回答

4
我曾因错误使用而遇到了同样的问题。
var https = require('https'); 

但我的代理只支持HTTP,因为你将它设置在路径参数上,代理将负责完成HTTPS请求。

(...)
path: 'https://crm.zoho.com/crm/private/json/Leads/getMyRecords?authtoken=11111tsvs26677026bcba45ae3f&scope=crmapi',
(...)

对我来说这个方法可行:

// baiken9: use http here
var http = require('http');

var username = 'username';
var password = 'password';
var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
var data = '';
var options = {
  hostname: 'proxy',
  // baiken9: Proxy Port
  port: 8080,  
  // baiken9: Add method type in my case works using POST
  method: "POST", 
  // baiken9: when proxy redirect you request will use https. It is correct as is
  path: 'https://crm.zoho.com/crm/private/json/Leads/getMyRecords?authtoken=11111tsvs26677026bcba45ae3f&scope=crmapi',
  headers: {
    // baiken9: I cannot test it my proxy not need authorization
    "Proxy-Authorization" : auth,
    // baiken9: required for redirection
    host: "crm.zoho.com",
  // baiken9: length of data to send
    'content-length': 0
  }
};

console.log("options- " + JSON.stringify(options) + '\n');


var req = http.request(options, function(res) {

  console.log("statusCode- " + res.statusCode);
  console.log("headers-" + res.headers);

  res.on('data', function(chunk) {
    data += chunk;
  });

  res.on('end', function(chunk) {
    console.log('response-' + data);
  });

});

req.end();

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

输出:

statusCode- 200
headers-[object Object]
response-{"response":{"error":{"message":"Invalid Ticket Id","code":"4834"}}}

亲切的问候。

@BaikeN9即使我的代理服务器只支持http连接,如果是这种情况,我该如何纠正这个问题呢?您能帮助我解决这个问题吗? - Manoj
我已经编辑了我的答案,并添加了一些注释来解释代码。 - BaikeN9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接