Как я могу отправить запрос AJAX на сервер node.js через HTTPS? - PullRequest
0 голосов
/ 17 февраля 2012

У меня следующий сервер node.js, настроенный для прослушивания порта 9001

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!

На этом этапе, если я получаю доступ к этому URLdirecty (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!

Я не понимаю, почему я получаю это сообщение, поскольку и мой сервер форм, и сервер узлов находятся на одном сервере. Спасибо, что нашли время для чтения, я благодарен за любую помощь, которую я могу получить в этом.мы застряли на некоторое время!

1 Ответ

2 голосов
/ 17 февраля 2012

Вы столкнулись со спецификацией Cross-Origin Resource Sharing (CORS).

Обратите внимание на OPTIONS в вашем выводе. HTTP-глагол OPTIONS HTTP используется браузером для запроса веб-сервера о 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 должен возвращать соответствующий код ошибки для каждого метода запроса, который вы не поддерживаете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...