0

我正在尝试设置跨域的 GET 请求。域 A 是目标,它有一个名为 /getUser 的服务:

(...)
server.get('/getUser', function(req, res) {
    console.log('Call received');
}
(...)

如您所见,它并没有做太多,我只是想确保请求到达。域A有一个公共的js文件,实现了对这个服务的调用:

function callDomainA(){
  var url = 'https://domainA.com/getUser?callback=?';

  var xhr = _createCORSRequest('GET', url);
  if (!xhr) {
    console.log('CORS not supported by browser, try jsonp');
    _doJSONP(url)
  }
else{
    xhr.onload = function() {
        console.log('Success : ' + JSON.stringify(xhr.responseText));
    };

    xhr.onerror = function() {
        console.log('ERROR : There was an error with the CORS request.');
    };
}

xhr.send();

return false;
}

function _doJSONP(){
   (...)
}


function _createCORSRequest(method, url) {
   var xhr = new XMLHttpRequest();

    if ("withCredentials" in xhr) 
        xhr.open(method, url, true);  // XHR for Chrome/Firefox/Opera/Safari.
    else if (typeof XDomainRequest != "undefined") {
        xhr = new XDomainRequest();  // XDomainRequest for IE.
    xhr.open(method, url);
 } 
 else 
    xhr = null;  // CORS not supported.

 return xhr;
}

然后我有域 B,它从域 A 加载 js 脚本,然后执行 callDomainA() 函数:

<script src="https://domainA.com/domainApublicjsfile.js"    type="text/javascript"></script>
(...)
callDomainA();
(...)

当我在域 B 中加载包含对域 A 的调用的页面并触发对 callDomainA() 的调用时,代码检测到浏览器 (Firefox) 可以执行 CORS,但我收到的标题指示错误 500 和 ns_error_dom_bad_uri

我会期待这样的事情,因为我在域 A 中没有做任何事情来接受 CORS 请求或任何事情,但我担心请求似乎没有到达服务,或者至少 console.log() 是没有注册任何东西。

我错过了什么吗?

提前感谢您的宝贵时间。

4

2 回答 2

1

?仅在 URI 中有效一次,以表示查询字符串的开始。之后,它需要进行 URL 编码:

.../getUser?callback=%3f

但是,虽然这可能会通过浏览器的验证,但它仍然不是 JSONP 的有效“填充”。callback应该指定将被调用并传递 JSON 响应的全局函数的名称:

function handleJSONPRequest(data) {
    // ...
}

function callDomainA(){
    var url = 'https://domainA.com/getUser?callback=handleJSONPRequest';

    // ...
}

callback=?快捷方式是某些库(例如 jQuery)的一项功能,可将 替换为?生成的函数的名称。但是,它不受 支持XMLHttpRequest

$.getJSON('.../getUser?callback=?');
// GET .../getUser?callback=jQuery18204235873776488006_1354320142256&...
于 2012-12-01T00:07:59.507 回答
0

我想向您推荐我的名为simpleS的模块,它以非常简单的方式实现了 CORS,并在 Google Chrome、Mozilla Firefox 和 Opera 上进行了测试。默认情况下,它旨在接受来自当前主机或本地文件系统来源的请求。要接受来自其他来源的请求,您需要以下内容:

var simples = require('simples');
var server = simples(80);

server.config({
    cors: {
        origins: ['domaina.com', 'domainb.com'] // ['*'] for requests from anywhere
    }
});

server.get('/getUser', function (request, response) {
    // Your application logic
});

更多关于 simples 的文档在这里。该模块仍在开发中,但您可以尝试一下。

于 2012-12-01T10:16:25.330 回答