JSON Padding (JSONP) は、Web ブラウザーでのクロスサイト スクリプティングのサポートを可能にするメカニズムです。 JSONP は、現在読み込まれているドキュメントの取得元とは異なるサイトからスクリプトを読み込む Web ブラウザーの機能を中心に設計されています。 このメカニズムは、次の例に示すように、JSON ペイロードにユーザー定義のコールバック関数名を埋め込むことで機能します。
callback({"a" = \\"b\\"});
前の例では、json ペイロード {"a" = \\"b\\"}
は、 callback
関数呼び出しでラップされています。 コールバック関数は、現在の Web ページで既に定義されている必要があります。 JSONP 応答のコンテンツ タイプは application/javascript
。
JSONP は自動的に有効になりません。 これを有効にするには、次の例に示すように、javascriptCallbackEnabled
属性をいずれかの HTTP 標準エンドポイント (true
または WebHttpEndpoint) でWebScriptEndpointするように設定します。
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" javascriptCallbackEnabled="true"/>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
コールバック関数の名前は、次の URL に示すように、callback と呼ばれるクエリ変数で指定できます。
http://baseaddress/Service/RestService?callback=functionName
呼び出されると、サービスは次のような応答を送信します。
functionName({"root":"Something"});
次の例に示すように、 JavascriptCallbackBehaviorAttribute をサービス クラスに適用することで、コールバック関数名を指定することもできます。
[ServiceContract]
[JavascriptCallbackBehavior(ParameterName = "$callback")]
public class Service1
{
[OperationContract]
[WebGet(ResponseFormat=WebMessageFormat.Json)]
public string GetData()
{
}
}
前に示したサービスの場合、要求は次のようになります。
http://baseaddress/Service/RestService?$callback=anotherFunction
呼び出されると、サービスは次のように応答します。
anotherFunction ({"root":"Something"});
HTTP 状態コード
HTTP 状態コードが 200 以外の JSONP 応答には、次の例に示すように、HTTP 状態コードの数値表現を含む 2 番目のパラメーターが含まれます。
anotherFunction ({"root":"Something"}, 201);
検証
JSONP が有効になっている場合、次の検証が実行されます。
WCF インフラストラクチャは、
javascriptCallback
が有効になっている場合、コールバック クエリ文字列パラメーターが要求に存在し、応答形式が JSON に設定されている場合に例外をスローします。要求にコールバック クエリ文字列パラメーターが含まれているが、操作が HTTP GET でない場合、コールバック パラメーターは無視されます。
コールバック名が
null
または空の文字列の場合、応答は JSONP として書式設定されません。