Похоже, что нет способа реализовать решение JSONP (JSON with Padding) с использованием DataSnap, но я хочу выбросить этот вопрос здесь на случай, если кто-то решил эту проблему.
Справочная информация: JSONP - это механизм, использующий возможность межсайтовых ссылок элемента HTML-сценария для преодоления той же политики происхождения, что и у класса XmlHttpRequest. Используя XmlHttpRequest, вы можете получать данные (объекты JSON) только из того же домена, который обслуживал HTML-документ. Но что, если вы хотите получить данные с нескольких сайтов и связать их с элементами управления в браузере?
В JSONP ваш атрибут src элемента script не ссылается на файл JavaScript, а вместо этого ссылается на веб-метод (который может находиться в другом домене, из которого был получен HTML-код). Этот веб-метод возвращает JavaScript.
Тег script предполагает, что возвращаемые данные являются файлом JavaScript, и выполняет их нормально. Однако то, что на самом деле возвращает веб-метод, - это вызов функции с литеральным объектом JSON в качестве параметра. Предполагая, что вызываемая функция определена, она выполняется и может работать с объектом JSON. Например, функция может извлекать данные из объекта JSON и связывать эти данные с текущим документом.
Плюсы и минусы JSONP широко обсуждались (это представляет очень серьезную проблему безопасности), поэтому нет необходимости повторять это здесь.
Что меня интересует, так это то, что кто-нибудь уже понял, как использовать JSONP с REST-серверами Delphi DataSnap REST. Вот проблема, на мой взгляд. Типичное использование JSONP может включать тег script, который выглядит примерно так:
<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
Веб-метод getdata возвращает вызов, похожий на следующий:
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.
Есть идеи?