简体   繁体   English

获得REST API服务器以支持HTTPS和HTTP

[英]Get restify REST API server to support both HTTPS and HTTP

I am using node.js restify ver4.0.3 我正在使用node.js restify ver4.0.3

The simple following code works as a simple REST API server that supports HTTP. 以下简单代码用作支持HTTP的简单REST API服务器。 An example API call is http://127.0.0.1:9898/echo/message 示例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);
});

Suppose I want to support HTTPS and make the API call https://127.0.0.1:9898/echo/message 假设我想支持HTTPS并进行API调用https://127.0.0.1:9898/echo/message

How can this be done? 如何才能做到这一点?

I noticed that restify code changes pretty fast and older code with older version may not work with the latest version. 我注意到,解析代码变化非常快,旧版本的旧代码可能无法与最新版本一起使用。

Thanks to the comment from Bas van Stein, here is a complete working example. 感谢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);
    });

To use HTTPS, you need a key and a certificate: 要使用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);

You will need to start both servers for allowing both HTTP and HTTPS access: 您需要启动两个服务器以允许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);
});.

To configure routes to server, declare same routes for both servers, redirecting between HTTP and HTTPS as needed: 要配置到服务器的路由,请为两个服务器声明相同的路由,根据需要在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   
});

The above listens to requests to a route /1 and simply redirects it to the HTTPS server which processes it. 以上内容侦听对路由/1请求,并简单地将其重定向到处理它的HTTPS服务器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM