DataSnapを使用してJSONP(JSDA with Padding)ソリューションを実装する方法はありませんが、誰かがこの問題を解決した場合に備えて、ここでこの質問を投げたいと思います。Delphi DataSnap RESTサーバーでJSONPを使用する方法はありますか?
背景JSONPは、HTMLスクリプト要素のクロスサイト参照機能を利用して、XmlHttpRequestクラスの同じ起点ポリシーを克服するメカニズムです。 XmlHttpRequestを使用すると、HTMLドキュメントを提供したのと同じドメインからのみデータ(JSONオブジェクト)を取得できます。しかし、複数のサイトからデータを取得し、そのデータをブラウザのコントロールにバインドする場合はどうしたらよいでしょうか?
JSONPでは、script要素のsrc属性はJavaScriptファイルを参照せず、代わりにWebメソッド(HTMLが取得された別のドメインに存在する可能性がある)を参照します。このWebメソッドは、JavaScriptを返します。
スクリプトタグは、返されたデータがJavaScriptファイルであるとみなし、通常どおりに実行します。しかし、Webメソッドが実際に返すものは、リテラルJSONオブジェクトをパラメータとする関数呼び出しです。呼び出される関数が定義されていると仮定すると、この関数はJSONオブジェクトを実行して操作することができます。たとえば、この関数はJSONオブジェクトからデータを抽出し、そのデータを現在のドキュメントにバインドできます。
JSONPの長所と短所は広範に議論されています(これは非常に深刻なセキュリティ上の問題です)。ここではこれを繰り返す必要はありません。
DelphiのDataSnap RESTサーバーでJSONPを使用する方法を知りたがっている人がいます。私はそれを見ているように、ここに問題があります。
<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
函Webメソッドは、次のような呼び出し何かを返します:
workit({"id": "Delphi Pro", "price":999});
とworkit機能のようなものに見えるかもしれません典型的なJSONPの使い方は次のようになりますscriptタグを含むことができこの:
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のではありません。
アイデア?
質問は "に減少させることができますDataSnapは、クライアントに送信される前に生成されたJSON応答を変更できるフィルタ/フック/イベントを提供していますか? – mjn