【发布时间】:2012-03-15 11:00:54
【问题描述】:
我正在编写一个 Node.js 应用程序,它必须从我们的一个内部 API 请求一些数据。棘手的部分是我从中请求数据的服务器有一定的限制:
- 请求必须使用 HTTPS 协议(不是 HTTP)
- 请求必须使用 LAN IP 地址,因为该域名在内部不起作用
- 请求必须看起来像是从外部域名请求的,因为虚拟主机就是为此设置的。
为了做到这一点,我正在运行一些看起来像这样的代码:
var headers = {
Host: externalHostname,
Hostname: externalHostname,
};
var options = {
host: InternalIP,
path: path,
method: 'GET',
headers: headers
};
var req = https.request(options, function(res) {
res.setEncoding('utf8');
var data = "";
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
//Do something with that data
});
res.on('error', function(err) {
console.log("Error during HTTP request");
console.log(err);
});
});
req.end();
很遗憾,我收到了 400(您的浏览器发送了此服务器无法理解的请求)错误作为响应。我反复检查了主机名、IP 地址和路径名是否正确(我可以在浏览器中测试它们,一切都很好)。
我输出了我的响应变量 (res),并收到了 UNABLE_TO_VERIFY_LEAF_SIGNATURE 的 authorizationError 值。我不确定那是什么,或者是否是我的问题,但这是我能找到的唯一有用的信息。
我把我的响应变量here的完整输出。
关于可能导致此问题的任何想法?
更新:我想通了!我试图通过传递 ?PHPSESSID=asdad GET 变量来向服务器进行身份验证,但他们已禁用该变量。我可以通过在 Cookie 标头中设置 PHPSESSID 来使其工作。
【问题讨论】:
-
你在
var https = require('https');上方的某处有这样的一行吗? -
@MikeL。对。 https 是一个全局变量,我知道它正在工作,因为实际的 HTTPS 请求会触发 - 它只是响应 400 错误。
-
您的选项中还缺少
method:['get','post']...这是文档nodejs.org/docs/v0.4.0/api/https.html#https.request -
@MikeL。刚刚添加 - 没有运气。
-
我现在正在查看
authorizationError: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'错误...是您的 SSL 证书。自签?