如何通过HTTPS将AJAX请求发送到node.js服务器?

问题描述:

我有以下的node.js服务器设置监听端口9001如何通过HTTPS将AJAX请求发送到node.js服务器?

var https = require('https'); 
var fs = require('fs'); 
var qs = require('querystring');  
var options = { 
    key: fs.readFileSync('privatekey.pem'), 
    cert: fs.readFileSync('certificate.pem') 
}; 
https.createServer(options, function (req, res) { 
    res.writeHead(200); 
    console.log('Request Received!'); 
    console.log(req.method); 
    if (true || req.method == 'POST') { 
    var body = ''; 
    req.on('data', function (data) { 
     body += data; 
    }); 
    req.on('end', function() { 
     console.log(body); 
     var POST = qs.parse(body); 
     console.log(POST); 
    }); 
    } 
    res.end("hello, world\n"); 
}).listen(9001); 

,我试图让该服务器到AJAX响应号召

function form_save() 
{ 
    console.log("submitted!"); 
    var data_obj = { 
    data1: "item1", 
    data2: "item2" 
    } 
    $.ajax({ 
    url: 'https://adam.testserver.com:9001/', 
    type: "POST", 
    dataType: "json", 
    data: data_obj, 
    success: function() { 
     console.log("success!"); 
    }, 
    complete: function() { 
     console.log("complete!"); 
    } 
    }); 
} 

没有与发生的两个问题我的安排。第一个是,如果我启动服务器,然后点击触发我的form_save按钮()的节点服务器不响应,我得到以下错误:

submitted! 
OPTIONS https://adam.testserver.com:9001/ Resource failed to load 
jQuery.extend.ajaxjquery.js:3633 
$.ajaxjquery.validate.js:1087 
form_savew_worksheet.php:64 
confirm_deletew_worksheet.php:95 
jQuery.event.handlejquery.js:2693 
jQuery.event.add.handlejquery.js:2468 
w_worksheet.php:73 
complete! 

在这一点上,如果我访问该网址directy( https://adam.testserver.com:9001/)我得到预期的“hello,world”输出以及控制台消息“Request Received! GET”。从这一点上,如果我点击按钮触发我的AJAX呼叫,我会得到一个新的错误。

submitted! 
XMLHttpRequest cannot load https://adam.testserver.com:9001/. Origin 
https://adam.testserver.com is not allowed by Access-Control-Allow-Origin. 
w_worksheet.php:73 
complete! 

我不明白为什么我得到这个消息既是我的形式和节点服务器驻留在同一台服务器上。感谢您抽出宝贵的时间阅读,我非常感谢任何帮助。我已经被卡住了一段时间了!

您已经遇到了Cross-Origin Resource Sharing(CORS)规范。

请注意输出中的OPTIONSThe OPTIONS HTTP Verb被浏览器用来查询网页服务器的URL,而不是GET其内容或POST数据。

您的服务器未响应CORS请求上的正确标题数据,因此您的浏览器假定其无权访问数据并拒绝GET或POST至该URL。

如果你真的想要让世界上运行的是AJAX请求,你可以做同样的事情到以下网站:

function handleOptions(request, response) { 
    response.writeHead(200, { 
     "Access-Control-Allow-Origin": "*", 
     "Access-Control-Allow-Method": "POST, GET, OPTIONS", 
     "Access-Control-Allow-Headers": request.headers["access-control-request-headers"] 
    }); 
    response.end(); 
} 

function server(request, response) { 
    if(request.method == "POST") { 
     handlePost(request, response); 
    } else if(request.method == "OPTIONS") { 
     handleOptions(request, response); 
    } else { 
     handleOther(response); 
    } 
} 
https.createServer(sslObj, server).listen(9001); 

您可以填写详细信息,以及是否应该单独处理GET,依此类推(handleOther应为您不支持的每种请求方法返回适当的错误代码)。

+0

谢谢!这是很棒的信息,让我重新开始运行。它的作品,但我很好奇,为什么这被认为是交叉起源。是否因为我提交的表单是坐在apache服务器上的,我试图在节点服务器中处理它的数据?再次感谢您的帮助! – akronymn 2012-02-18 16:00:40

+0

对不起,延迟回复。我认为[这是为什么](http://www.w3.org/TR/cors/#access-control-allow-origin-response-hea#user-agent-security)。它看起来像所有的HTTPS请求都需要CORS,因为SSL证书可能不同(因此由两个独立的逻辑实体正式运行)。 – 2012-02-20 17:12:06