2015-11-12 8 views
5

Ich verwende node.js zu unterstützen restify ver4.0.3Get restify REST API-Server HTTPS und HTTP

Der einfache folgende Code als einen einfachen RESTES API-Server arbeitet, die HTTP unterstützt. Ein Beispiel API-Aufruf ist 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); 
}); 

Angenommen, ich möchte HTTPS unterstützen und den API-Aufruf machen https://127.0.0.1:9898/echo/message

Wie kann dies geschehen?

Ich habe festgestellt, dass Restify Code ändert sich ziemlich schnell und älterer Code mit älterer Version funktioniert möglicherweise nicht mit der neuesten Version.

+1

Haben Sie überprüfen http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/? –

+0

Danke. Sieht gut aus. Ich versuche ein Beispiel anhand dieses Links. Einige Probleme im Moment. – user781486

Antwort

9

HTTPS verwenden zu können, benötigen Sie einen Schlüssel und ein Zertifikat:

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); 

Sie beide Server starten müssen sowohl für das Erlauben HTTP und HTTPS-Zugriff:

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); 
});. 

konfigurieren Routen zum Server, Deklarieren derselben Routen für beide Server, Umleiten zwischen HTTP und HTTPS nach Bedarf:

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 
}); 

Das obige hört Anfragen auf eine Route /1 und leitet es einfach an den HTTPS-Server um, der es verarbeitet.

9

Dank dem Kommentar von Bas van Stein, hier ist ein komplettes Arbeitsbeispiel.

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); 
    });