2015-11-12 15 views
5

Tôi đang sử dụng node.js khôi phục ver4.0.3Nhận khôi phục máy chủ REST API để hỗ trợ cả HTTPS và HTTP

Mã đơn giản sau đây hoạt động như một máy chủ REST API đơn giản hỗ trợ HTTP. Một cuộc gọi dụ API là 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); 
}); 

Giả sử tôi muốn hỗ trợ HTTPS và thực hiện cuộc gọi API https://127.0.0.1:9898/echo/message

Làm thế nào điều này có thể được thực hiện?

Tôi nhận thấy rằng việc khôi phục các thay đổi mã khá nhanh và cũ hơn với phiên bản cũ hơn có thể không hoạt động với phiên bản mới nhất.

+1

Bạn đã kiểm tra http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/? –

+0

Cảm ơn. Có vẻ tốt. Tôi đang thử một ví dụ dựa trên liên kết đó. Một số vấn đề vào lúc này. – user781486

Trả lời

9

Để sử dụng HTTPS, bạn cần một chìa khóa và chứng chỉ:

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

Bạn sẽ cần phải bắt đầu cả hai máy chủ cho phép cả HTTP và HTTPS truy cập:

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

Để cấu hình các tuyến đường đến máy chủ, khai báo các tuyến đường tương tự cho cả hai máy chủ, chuyển hướng giữa HTTP và HTTPS khi cần:

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

Các bên trên nghe yêu cầu tới tuyến đường /1 và chỉ cần chuyển hướng đến máy chủ HTTPS xử lý nó.

9

Nhờ nhận xét của Bas van Stein, đây là một ví dụ hoàn chỉnh.

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); 
    }); 
Các vấn đề liên quan