0

サーバーに次のヘッダーを設定しています

response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
response.addHeader("Access-Control-Allow-Headers","X-Custom-Header");

そして、POSTメソッドを使用してWebサービスにアクセスし、それにデータを送信したいのですが、問題はサーバーでのセットアップが問題を引き起こしていることです

私は次の方法を使用しました

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

そしてこのオブジェクトに基づいて

url = "http://myurl.do";
var xhr = createCORSRequest('POST', url);
if (!xhr) {
    alert('CORS not supported');
    return;
}
var params = "name=pari123&action=initaction&gameId=slotreel3";
xhr.setRequestHeader('Content-Type', 'application/text/plain'); 
if(xhr.readyState == 4 && xhr.status == 200) 
{
    alert('Tested OK')
    xhr.send(params);
}
else
{
    alert('status not 200 or xhr is not ready');
}

// Response handlers.
xhr.onload = function() {
    var text = xhr.responseText;
    alert('Response from CORS request to ' + url + ': ' + text);
};

xhr.onerror = function() {
    alert('Woops, there was an error making the request.');
};

ただし、常に「ステータスが200でないか、xhrの準備ができていません」というメッセージが表示されます。ご存知の場合は、誰も続行できません。

私がxhr.readyStateその印刷を印刷するとき、値1

4

3 に答える 3

2
if(xhr.readyState == 4 && xhr.status == 200) 

このチェックは、onreadystatechangeイベントハンドラーに配置する必要があります。実際に送信する前に、200ステータスコードまたは「終了」リクエストを取得することはできません。

あなたが欲しかったのはおそらくこれです:

xhr.onreadystatechange = function() {
    if(xhr.readyState == 4 && xhr.status == 200) {
        alert('Tested OK');
        var text = xhr.responseText;
        alert('Response from CORS request to ' + url + ': ' + text);
    }
};
xhr.send(params);

elseケースでエラーをチェックする場合は、引き続きチェックする必要があることに注意してくださいxhr.readyState == 4。エラー処理コードを他のreadyStatesで実行したくない場合。

イベントは必要ありません。リクエストが終了したことがわかっonloadたら、イベントは必要ありません。readyState == 4

于 2012-07-04T14:01:30.290 に答える
2

ここにはいくつかの問題があります。

ブラウザが異なればCORSの実装も異なることに気づきました。私の経験はFirefoxとGoogleChromeに基づいています。たとえば、サーバー側に特別なヘッダーを追加する必要がありました。これにより、FirefoxはGoogle Chromeと同じように、1つの接続を使用してプリフライト(OPTIONS)リクエストと実際のリクエスト(GET、PUTなど)を作成します。サーバー側で追加する必要があります。

response.addHeader("Keep-Alive", "timeout=2, max=100");
response.addHeader("Connection", "Keep-Alive");

また、一部のブラウザーはCORSヘッダーのワイルドカード( "*")を好まないことに気付きました。ラインの回避策

response.addHeader("Access-Control-Allow-Origin", "*");

ワイルドカードではなく、リクエストの発信元を返すことになります。

ただし、他の問題もある可能性があり、詳細が必要になります。たとえば、サーバーが同じドメインでホストされている場合、リクエストは機能しますか(つまり、問題はCORSに関連していない可能性があります)。どのサーバーを使用していますか?

于 2013-02-10T19:18:25.980 に答える
0

xhr.send();呼び出しの直後にする必要がxhr.open();ありますか?ステータス1は、リクエストがまだ送信されていないことを意味します。実際にリクエストを送信しない限り、ステータス4に到達することはありません。

于 2012-07-04T14:01:16.737 に答える