【问题标题】:Get restify REST API server to support both HTTPS and HTTP获取 restify REST API 服务器以支持 HTTPS 和 HTTP
【发布时间】:2016-02-13 11:16:00
【问题描述】:

我正在使用 node.js restify ver4.0.3

下面的简单代码可用作支持 HTTP 的简单 REST API 服务器。一个示例 API 调用是 http://127.0.0.1:9898/echo/message

var restify = require('restify');

var server = restify.createServer({
    name: 'myapp',
    version: '1.0.0'
});
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());

//http://127.0.0.1:9898/echo/sdasd
server.get('/echo/:name', function (req, res, next) {
    res.send(req.params);
    return next();
});

server.listen(9898, function () {
    console.log('%s listening at %s', server.name, server.url);
});

假设我想支持 HTTPS 并进行 API 调用 https://127.0.0.1:9898/echo/message

如何做到这一点?

我注意到 restify 代码更改非常快,旧版本的旧代码可能不适用于最新版本。

【问题讨论】:

标签: javascript node.js rest https restify


【解决方案1】:

要使用 HTTPS,您需要密钥和证书:

var https_options = {
  key: fs.readFileSync('/etc/ssl/self-signed/server.key'),
  certificate: fs.readFileSync('/etc/ssl/self-signed/server.crt')
};
var https_server = restify.createServer(https_options);

您需要同时启动两个服务器以允许 HTTP 和 HTTPS 访问:

http_server.listen(80, function() {
   console.log('%s listening at %s', http_server.name, http_server.url);
});.
https_server.listen(443, function() {
   console.log('%s listening at %s', https_server.name, https_server.url);
});.

要配置到服务器的路由,请为两个服务器声明相同的路由,根据需要在 HTTP 和 HTTPS 之间重定向:

http_server.get('/1', function (req, res, next) {
    res.redirect('https://www.foo.com/1', next);
});
https_server.get('/1', function (req, res, next) {
    // Process the request   
});

上面监听到路由/1的请求,并简单地将其重定向到处理它的HTTPS服务器。

【讨论】:

    【解决方案2】:

    感谢 Bas van Stein 的评论,这是一个完整的工作示例。

        var restify = require('restify');
        var fs = require('fs');
    
        // Setup some https server options
        //generated from http://www.selfsignedcertificate.com/
        var https_options = {
            key: fs.readFileSync('./HTTPS.key'), //on current folder
            certificate: fs.readFileSync('./HTTPS.cert')
        };
    
        // Instantiate our two servers
        var server = restify.createServer();
        var https_server = restify.createServer(https_options);
    
        // Put any routing, response, etc. logic here. This allows us to define these functions
        // only once, and it will be re-used on both the HTTP and HTTPs servers
        var setup_server = function(app) {
            function respond(req, res, next) {
                res.send('I see you ' + req.params.name);
            }
    
            // Routes
            app.get('/test/:name', respond);
        }
    
        // Now, setup both servers in one step
        setup_server(server);
        setup_server(https_server);
    
        // Start our servers to listen on the appropriate ports
        server.listen(9848, function() {
            console.log('%s listening at %s', server.name, server.url);
        });
    
        https_server.listen(443, function() {
            console.log('%s listening at %s', https_server.name, https_server.url);
        });
    

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多