我正在尝试设置跨域的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 ()没有注册任何东西。
我错过了什么吗?
提前感谢您的时间。
答案 0 :(得分:1)
?
仅在URI中有效一次,表示查询字符串的开头。之后,需要进行URL编码:
.../getUser?callback=%3f
但是,虽然这可能会通过浏览器的验证,但它仍然不是JSONP的有效“padding”。 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&...
答案 1 :(得分: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
});
有关简单here的更多文档。该模块仍在开发中,但您可以尝试一下。