Есть ли способ использовать JSONP с REST-сервером Delphi DataSnap?

Похоже, что нет способа реализовать решение JSONP (JSON with Padding) с использованием DataSnap, но я хочу задать этот вопрос здесь на случай, если кто-то решил эту проблему. проблема.

Справочная информация: JSONP - это механизм, который использует возможность ссылки между сайтами элемента сценария HTML для преодоления той же политики происхождения, что и у класса XmlHttpRequest. Используя XmlHttpRequest, вы можете получать данные (объекты JSON) только из того же домена, который обслуживал документ HTML. Но что, если вы хотите получить данные с нескольких сайтов и привязать эти данные к элементам управления в браузере?

В JSONP ваш атрибут src элемента сценария не ссылается на файл JavaScript, а вместо этого ссылается на веб-метод (тот, который может находиться в другом домене, из которого был получен HTML). Этот веб-метод возвращает JavaScript.

Тег сценария предполагает, что возвращенные данные являются файлом JavaScript, и выполняет его нормально. Однако на самом деле веб-метод возвращает вызов функции с буквальным объектом JSON в качестве параметра. Предполагая, что вызываемая функция определена, функция выполняется и может работать с объектом JSON. Например, функция может извлекать данные из объекта JSON и связывать эти данные с текущим документом.

Плюсы и минусы JSONP широко обсуждаются (он представляет собой очень серьезную проблему безопасности), поэтому нет необходимости повторите это здесь.

Меня интересует, придумал ли кто-нибудь, как использовать JSONP с серверами Delphi DataSnap REST. Вот в чем проблема, как мне кажется. Типичное использование JSONP может включать тег скрипта, который выглядит примерно так:


Веб-метод 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.

Есть идеи?

7
задан mjn 17 July 2011 в 11:11
поделиться