0

サーバーに投稿する XML を手動で作成しています。XML を検証しましたが、有効でエラーはありません。

ここに私の投稿があります:

$.ajax({
    type: 'POST',
    url: submitUrl,
    data: xmlString,
    dataType: 'text',
    beforeSend:function() {
        console.log(submitUrl);
    },
    success:function(data) {
        console.log(data);
    },
    error:function(error) {
        console.log(error);
    }
}); 

var xmlStringは XML を含むテキスト文字列です。残念ながら公開することはできませんが、本質的には次のようになります。

var xmlString = '<?xml version="1.0" encoding="utf-8"?> ... '

コードはローカルではなく Web サーバー上で実行されていますが、取得できるのは次のとおりです。

XMLHttpRequest cannot load <URL>. Origin <URL> is not allowed by Access-Control-Allow-Origin. 

ただし、サーバーはこれらのタイプのリクエストに対してロックダウンされていないため、投稿は通過するはずですが、毎回上記のメッセージが表示されます。

アイデア、試すことができること、より良いデバッグ メッセージを取得する方法はありますか?

4

1 に答える 1

2

あなたのコードは実際には、通常の POST ではなく、クロスドメイン (CORS) リクエストを作成しようとしています。

最新のブラウザーでは、ソース HTML ページと同じドメイン内のページへの Ajax 呼び出しのみが許可されます。

つまり、Ajax リクエストを作成しようとする HTML ページがターゲット URL と同じドメイン上にない場合、ブラウザーは呼び出しを行いません (ご想像のとおり)。代わりに、CORS リクエストを作成しようとします。

あなたは言う:

(...) サーバーは、これらのタイプの要求に対してロックダウンされていません (...)

より良いデバッグ: ページとサーバーの間で行われているネットワーク トランザクション (送信された要求と受信された応答) を見てください。(ChromeではF12+Networkタブです。) よく見ると、POST一度も送信されていません。代わりに、OPTIONSリクエストがあります。Access-Control-Allow-Originブラウザは、HTML ページが展開されているドメイン URL を含むヘッダーが応答に含まれていることを想定しています。 の応答に、OPTIONSこれらのヘッダーが含まれていないか、含まれていません。ブラウザは、そのようなアクセスは許可されていないと判断し、エラーになります。

CORS の詳細:

Cross-Origin Resource Sharing (CORS) 1は、Web ページをXMLHttpRequests別のドメインに作成できるようにするメカニズムです。このような「クロスドメイン」リクエストは、同一オリジン セキュリティ ポリシーにより、Web ブラウザによって禁止されます。

簡単に言うと、CORS リクエストを実行するには、ブラウザで次のことを行います。

  • 最初にOPTIONターゲット URL にリクエストを送信します
  • そして、それに対するサーバーの応答に、CORS 要求を許可するための適切なヘッダー (ヘッダーの 1 つ) が含まれている場合にのみ、ブラウズは呼び出しを実行します (HTML ページが同じドメインにある場合とほぼ同じ方法で)。 OPTIONAccess-Control-Allow-Origin
    • 期待されるヘッダーが来ない場合、ブラウザーは単純にあきらめます (あなたがそうしたように)。

それを解決する方法は?最も簡単な方法は、サーバーで CORS を有効にする (必要なヘッダーを有効にする) ことです。サーバー側でアクセスできない場合は、別の場所から Web サービスをミラーリングし、そこで CORS を有効にすることができます。

于 2013-06-02T01:00:08.990 に答える