Похоже, что нет возможности реализовать решение JSONP (JSON с Padding) с использованием DataSnap, но я хочу бросить этот вопрос здесь, если кто-то решил эту проблему.Есть ли способ использовать JSONP с сервером REST Delphi DataSnap?
Справочная информация: JSONP - это механизм, который использует возможности перекрестного сайта для элемента HTML-скрипта для преодоления одной и той же исходной политики класса XmlHttpRequest. Используя XmlHttpRequest, вы можете получать только данные (объекты JSON) из того же домена, который служил HTML-документу. Но что, если вы хотите получать данные с нескольких сайтов и связывать эти данные с элементами управления в браузере?
С помощью JSONP атрибут src элемента сценария не ссылается на файл JavaScript, но вместо этого ссылается на метод Web (который может находиться в другом домене, из которого был получен HTML-код). Этот веб-метод возвращает JavaScript.
Тэг сценария предполагает, что возвращаемые данные являются файлами JavaScript и выполняются в обычном режиме. Однако то, что фактически возвращает Web-метод, является вызовом функции с буквальным объектом JSON в качестве его параметра. Предполагая, что функция, которая вызывается, определена, функция выполняет и может работать с объектом JSON. Например, функция может извлекать данные из объекта JSON и связывать эти данные с текущим документом.
Достоинства и недостатки JSONP широко обсуждались (это представляет собой очень серьезную проблему безопасности), поэтому нет необходимости повторять это здесь.
Меня заинтересовало то, что кто-то там выяснил, как использовать JSONP с серверами DataSnap REST от Delphi. Вот проблема, как я вижу. Типичное использование 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.
Любые идеи?
вопрос можно свести к " DataSnap предлагает фильтр/крюк/событие, которое позволяет изменять сгенерированный ответ JSON до его отправки клиенту "? – mjn