DataSnapを使用してJSONP (JSON with Padding)ソリューションを実装する方法はないようですが、誰かがこの問題を解決した場合に備えて、この質問をここに投げ出します。
背景:JSONPは、HTMLスクリプト要素のクロスサイト参照機能を利用して、XmlHttpRequestクラスの同一生成元ポリシーを克服するメカニズムです。XmlHttpRequestを使用すると、HTMLドキュメントを提供したのと同じドメインからのみデータ(JSONオブジェクト)を取得できます。しかし、複数のサイトからデータを取得し、そのデータをブラウザーのコントロールにバインドする場合はどうでしょうか。
JSONPでは、script要素のsrc属性はJavaScriptファイルを参照しませんが、代わりにWebメソッド(HTMLが取得された別のドメインに存在できるメソッド)を参照します。このWebメソッドはJavaScriptを返します。
スクリプトタグは、返されたデータがJavaScriptファイルであると想定し、通常どおりに実行します。ただし、Webメソッドが実際に返すのは、パラメーターとしてリテラルJSONオブジェクトを使用した関数呼び出しです。呼び出される関数が定義されていると仮定すると、関数は実行され、JSONオブジェクトを操作できます。たとえば、この関数はJSONオブジェクトからデータを抽出し、そのデータを現在のドキュメントにバインドできます。
JSONPの長所と短所は広く議論されているため(これは非常に深刻なセキュリティ問題を表します)、ここでそれを繰り返す必要はありません。
私が興味を持っているのは、DelphiのDataSnapRESTサーバーでJSONPを使用する方法を誰かが理解しているかどうかです。私が見ているように、ここに問題があります。典型的なJSONPの使用法には、次のようなスクリプトタグが含まれる場合があります。
<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
getdata Webメソッドは、次のような呼び出しを返します。
workit({"id": "Delphi Pro", "price":999});
そして、workit関数は次のようになります。
function workit(obj) {
$("#namediv").val(obj.id);
$("#pricediv").val(obj.price);
}
問題は、DataSnapが次のような単純な文字列を返すことができないように見えることです。
workit({"id": "Delphi Pro", "price":999});
代わりに、次のようにラップされます。
{"result":["workit({\"id\":\"Delphi Pro\",\"price\":999});"]}
明らかに、これは実行可能なJavaScriptではありません。
何か案は?