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

次に、ドメイン A から js スクリプトをロードし、callDomainA() 関数を実行するドメイン B があります。

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

ドメイン A への呼び出しを含むドメイン B のページをロードし、callDomainA() への呼び出しをトリガーすると、コードはブラウザー (Firefox) が CORS を実行できることを検出しますが、受信したヘッダーはエラー 500 と ns_error_dom_bad_uri を示します。

ドメインAでCORSリクエストなどを受け入れるために何もしていないので、このようなことを期待しますが、リクエストがサービスに届かないように見えるか、少なくともconsole.log()が何も登録していません。

何か不足していますか?

よろしくお願いいたします。

4

2 に答える 2

1

?クエリ文字列の開始を示すために、URI で 1 回だけ有効です。その後、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 に答える