使用 https 的 REST 适配器

REST adapter to work with https

我正在用 Express 编写一个 REST 适配器,将传入的 REST 调用转换为北向设备公开的另一个 REST API。因此,从本质上讲,客户端设备正在向适配器公开的 REST API 发送请求,而适配器将 REST 请求发送到另一个设备。因此适配器既是客户端设备的 REST 服务器,也是北向设备的 REST 客户端。

var express = require('express');
var router = express.Router();
var request = require('request');

router.route('/')
    .get(function(req, res) {           
        request('URL'', function (error, response, body) {

            if (!error && response.statusCode == 200) {
                console.log("Sent to MOS");
                console.log(body) // Print the google web page.
            }
        })
    });

module.exports = router;

我正在使用请求模块。我的北向设备公开了一个 https REST API。当我在上面代码的 URL 部分插入 https(注意 's')REST API 调用时,我没有得到答案从北向设备返回。

如果上面的 'URL' 指向 https 网站,如 https://www.httpsnow.org/,则效果很好。此外,当我在 POSTMAN 中或在同一设备上的浏览器中使用 https REST API 时,我会得到正确的响应。

所以我不明白为什么它可以在 POSTMAN 中运行,但不能在我的代码中运行。我必须先从兄弟那里接受证书,所以我想问题是我的代码没有经过身份验证,但是如何在其中构建该身份验证?

这可能是北向网络服务器配置的问题,而不是请求库本身的问题。尝试将用户代理字符串更改为其他内容:

var opts = {
  url: 'URI',
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
  }
};

request(opts, function (err, res, body) {
  // Do stuff
});

这是一个微不足道的错误 - 您的服务器打开了到 HTTPS 服务器的连接,服务器的证书似乎无效,握手被拒绝并且您收到错误而不是响应。

幸运的是,request 原生支持自定义 HTTPS 证书(即显示为无效的证书将显示为有效)。

您可以为此使用 agentOptions 选项。下载您必须使用浏览器接受的证书(他们应该在他们的文档中提供一个)并将其另存为 ca.cert.pem(或其他扩展名,具体取决于他们提供的内容)在与 [=22= 相同的文件夹中] 您正在构建的应用程序。

然后像这样使用它:

var request = require('request');
var fs = require('fs');

request({
    url: 'https://api.some-server.com/',
    agentOptions: {
        ca: fs.readFileSync('ca.cert.pem') //Note: This will load the ca synchronously. Avoid doing this in production.
    }
}, function(error, response, body){
  if(error){
    console.warn(error); //If an error occurred, you'll be informed
    return; //Won't run the rest of the function
  }

  if(response.statusCode === 200){
    //Do whatever you want
  }
});