はい、これはSOPに違反しています。それを回避する方法はいくつかありますが、重要なポイントを強調する価値があります。
クライアントからリモートサーバーにアクセスしようとすると、そのサーバー側で共犯が必要になります。
では、オプションは何ですか?
JSON-P
JSON-Pでは、サーバーが呼び出しでラップされた応答をコールバック関数に返す必要があります。それはこのように動作します:
- 新しいスクリプトタグがページにDOMスクリプト化されるか、既存のタグが再利用されます
- スクリプトタグの
src
属性はリクエストパスとして設定されます(スクリプトタグはどこからでもスクリプトをロードできます-SOPの対象ではありません)
- 多くの場合(必ずしもではありませんが)JSONとしてエンコードされたデータを含むサーバー応答。これは、コールバック関数(JSで定義する必要があります)の呼び出しに対する引数として出力されます。
したがって、ネイティブJSで記述されたJSON-Pリクエストは、次のようになります。
callback = function(response) { console.log(response); };
var script = document.createElement('script');
script.src = 'http://www.some-request.com/here.php?callback=callback'; //the example happens to use the same name; the callback parameter tells the some-request domain what function to wrap JSON in
document.body.appendChild(script);
次に、サーバーの応答が
callback({"foo": "bar"});
...コンソールに応答が表示されます。関数はアクセス可能であり、スコープによって非表示にされてはならないため、明示的にグローバルにすることに注意してください。(この意味では、グローバルにアクセス可能である必要がありますが、従来の意味では必ずしもグローバルである必要はありません。たとえば、グローバル名前空間の静的メソッドである可能性があります)。
多くのJSON-P準拠のWebサーバーでは、通常、この情報をリクエストURLに追加することで、呼び出す関数の名前を指定できます&callback=func_name
。
これに関する詳細はこちら。
CORS / XHR2
CORSでは、XHR(つまり、AJAX)v2の背後にあるクロスドメインの考え方で、これは、サーバーがクロスドメインリクエストを行う可能性のあるドメイン(またはすべてのドメイン)を示すヘッダーを送信することを意味します。たとえば、PHPでは、すべての呼び出し元ドメインが次のように要求を行うことを許可できます。
header("Access-Control-Allow-Origin: *");
これに関する詳細はこちら。
EasyXDM *
EasyXDMは、ドメイン間でテキストベースのメッセージを投稿および受信するためのベンダー固有の新しいHTML5到着手段の数を照合し、一見の価値があります。
非JS
ボールを再生しないサーバーから何かを取得する必要がある場合、唯一のオプションは中間サーバー側スクリプトです。これらは、SOPの制限なしにリモートリソースをスクレイプできるcURL要求を発生させる可能性があるためです。
$curl = curl_init("http://www.example.com/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
cURLの詳細はこちら。