重複の可能性:
Ajaxクロスドメイン呼び出し
私のアプリケーションは、別のドメインでHTML5およびAJAXと対話するASP .Net Web API4.5RTMを使用しています。
このアプリケーションは、シリアル化/逆シリアル化にJSONではなくJSONPを使用する必要がありますか?
重複の可能性:
Ajaxクロスドメイン呼び出し
私のアプリケーションは、別のドメインでHTML5およびAJAXと対話するASP .Net Web API4.5RTMを使用しています。
このアプリケーションは、シリアル化/逆シリアル化にJSONではなくJSONPを使用する必要がありますか?
JSONPまたははJSON with padding
、基本のJSONデータ形式を補完するものです。これは、異なるドメインのサーバーからデータを要求する方法を提供します。これは、同一生成元ポリシーのために通常のWebブラウザーでは禁止されています。
同一生成元ポリシーでは、server1.example.comから提供されるWebページは、通常、server1.example.com以外のサーバーに接続したり通信したりすることはできません。
例外はHTML要素です。一部のページでは、要素のオープンポリシーを利用して、他のオリジンから動的に生成されたJSON形式のデータを操作するJavaScriptコードを取得します。この使用パターンはJSONPとして知られています。
JSONPのリクエストは、JSONではなく、任意のJavaScriptコードを取得します。これらは、JSONパーサーではなく、JavaScriptインタープリターによって評価されます。
このパターンがどのように機能するかを確認するには、最初にJSONデータを返すURLリクエストについて考えます。JavaScriptプログラムはXMLHttpRequest
、たとえば、を介してこのURLを要求する場合があります。FooのUserIdが1234であるとします。URLhttp://server2.example.com/Users/1234を要求し、FooのIDを渡すブラウザーは、次のようなものを受け取ります。
{"Name": "Foo", "Id": 1234, "Rank": 7}
このJSONデータは、URLで渡されたクエリパラメーターに従って動的に生成できます。ここで、HTML要素はそのsrc属性にJSONを返すURLを指定します。
<script type="text/javascript"
src="http://server2.example.com/Users/1234">
</script>
ブラウザは、順番に、スクリプトファイルをダウンロードし、その内容を評価し、生のJSONデータをブロックとして解釈し、構文エラーをスローします。データがJavaScriptオブジェクトリテラルとして解釈された場合でも、変数割り当てがないとオブジェクトリテラルにアクセスできないため、ブラウザで実行されているJavaScriptからデータにアクセスできませんでした。
JSONPの使用パターンでは、のsrc属性が指すURLリクエストは、関数呼び出しがラップされたJSONデータを返します。このようにして、JavaScript環境ですでに定義されている関数がJSONデータを操作できます。JSONPペイロードは次のようになります。
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
関数呼び出しは、JSONPの「P」です。純粋なJSONの周りの「パディング」、または一部の[1]によると「プレフィックス」です。慣例により、ブラウザは、サーバーへのリクエストで、通常はJSONPまたはコールバックという名前を使用して、名前付きクエリパラメータとしてコールバック関数の名前を提供します。
<script type="text/javascript"
src="http://server2.example.com/Users/1234?jsonp=parseResponse">
</script>
この例では、受信したペイロードは次のようになります。
parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7});