request.js在CURL成功获取授权标头的GET请求时失败

时间:2017-04-09 15:11:48

标签: node.js curl https requestjs

我可以使用curl中的授权标头发出GET请求,但不能使用Node.js中的requesthttps发出GET请求。服务器使用curl返回状态200,但使用requesthttps返回500。来自requesthttps的来电与curl的来电有什么不同?服务器如何以不同的方式阅读它们?

以下cURL从命令行成功:

curl -H "Authorization:  Bearer abc123def456" https://api.domain.com/path/to/resource

但同样的请求因Node

中的request.js而失败
var options = {
  type: 'get',
  url: "https://api.domain.com/path/to/resource",
  headers: {
     "Authorization": " Bearer abc123def456" 
  }
}
request(options, function (err, response, body) {
  assert.equal(response.statusCode, 200) ; // 500 internal error
})

以下使用auth选项的request.js也失败了:

var options = {
  type: 'get',
  url: "https://api.domain.com/path/to/resource",
  auth: {
    "bearer": "abc123def456" 
  }
}
request(options, function (err, response, body) {
  assert.equal(response.statusCode, 200) ; // 500 internal error
})

使用不https的{​​{1}}时,它也会失败:

request.js

但是如果从节点中删除卷曲请求成功:

var options = {
  host: 'api.domain.com',
  port: 443,
  path: '/path/to/info',
  method: 'GET',
  headers: {
    "Authorization": " Bearer abc123def456"
  }
}
var req = https.request(options, function (res) {
  res.setEncoding('utf8');
  res.on('end', function () {
    assert.equal(res.statusCode, 200) // 500 internal error
  })
});

req.on('error', function (e) {
  console.log('problem with request: ' + e.message);
});

req.end();

exec("curl -H "Authorization: Bearer abc123def456" https://api.domain.com/path/to/resource", function (error, stdout, stderr) { var obj = JSON.parse(stdout) // successfully retrieved and parsed }); 提供以下信息:

request-debug

1 个答案:

答案 0 :(得分:2)

500 internal error通常表示服务器端出错。因此,理想情况下,您应该查看服务器日志。

但是,如果您无法访问这些日志,请查看您尝试的每个选项发送的请求之间的差异:

模块:请求(使用手动指定的auth标头):

GET /path/to/resource HTTP/1.1
Authorization:  Bearer abc123def456
host: api.domain.com

模块:请求(具有明确指定的auth标头):

GET /path/to/resource HTTP/1.1
host: api.domain.com
authorization: Bearer abc123def456

模块:HTTP(带有手动指定的auth标头):

GET /path/to/info HTTP/1.1
Authorization:  Bearer abc123def456
Host: api.domain.com

卷曲:

GET /path/to/resource HTTP/1.1
Host: api.domain.com
User-Agent: curl/7.51.0
Accept: */*
Authorization:  Bearer abc123def456

很明显,其余模块不会发送HTTP headers'用户代理'并且'接受'因此,可能是服务器上运行的应用程序尝试解析其中至少一个并失败。