Parece que no hay forma de implementar una solución JSONP (JSON con relleno) usando DataSnap, pero quiero plantear esta pregunta aquí en caso de que alguien haya resuelto este problema.¿Hay alguna manera de usar JSONP con un servidor REST Delphi DataSnap?
Antecedentes: JSONP es un mecanismo que aprovecha la capacidad de referencia cruzada del elemento de script HTML para superar la misma política de origen de la clase XmlHttpRequest. Con XmlHttpRequest solo puede obtener datos (objetos JSON) del mismo dominio que sirvió el documento HTML. Pero, ¿qué sucede si desea recuperar datos de múltiples sitios y vincular esos datos a controles en el navegador?
Con JSONP, su atributo src del elemento de script no hace referencia a un archivo JavaScript, sino que hace referencia a un método web (uno que puede residir en un dominio diferente del que se recuperó el HTML). Este método web devuelve el JavaScript.
La etiqueta del script asume que los datos devueltos son un archivo JavaScript y se ejecuta normalmente. Sin embargo, lo que realmente devuelve el método Web es una llamada a función con un objeto JSON literal como su parámetro. Suponiendo que se define la función que se llama, la función se ejecuta y puede operar en el objeto JSON. Por ejemplo, la función puede extraer datos del objeto JSON y vincular esos datos al documento actual.
Los pros y contras de JSONP se han discutido extensamente (representa un problema de seguridad muy serio), por lo que no es necesario repetirlo aquí.
Lo que me interesa es si alguien ha descubierto cómo usar JSONP con los servidores de REST DataSnap de Delphi. Aquí está el problema, como lo veo. Un uso típico JSONP puede incluir una etiqueta de script que se ve algo como esto:
<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
El método Web leedato volvería una llamada algo así como lo siguiente:
workit({"id": "Delphi Pro", "price":999});
y la función Workit podría ser algo como esto:
function workit(obj) {
$("#namediv").val(obj.id);
$("#pricediv").val(obj.price);
}
La cuestión es que DataSnap no parece capaz de devolver una cadena simple como
workit({"id": "Delphi Pro", "price":999});
En su lugar, se envuelve, como la siguiente:
{"result":["workit({\"id\":\"Delphi Pro\",\"price\":999});"]}
Es evidente que esto no es ejecutable JavaScript.
¿Alguna idea?
la cuestión se reduce a " ¿DataSnap ofrece un filtro/gancho/evento que permite modificar la respuesta JSON generada antes de que se envíe al cliente? – mjn