Sembra che non ci sia modo di implementare una soluzione (JSON con Padding) usando DataSnap, ma voglio lanciare questa domanda qui nel caso qualcuno abbia risolto questo problema.C'è un modo per usare JSONP con un server REST Delphi DataSnap?
Sfondo: JSONP è un meccanismo che sfrutta la capacità di riferimento cross site dell'elemento di script HTML per superare lo stesso criterio di origine della classe XmlHttpRequest. Utilizzando una XmlHttpRequest è possibile ottenere solo dati (oggetti JSON) dallo stesso dominio che ha servito il documento HTML. Ma cosa succede se si desidera recuperare i dati da più siti e associare tali dati ai controlli nel browser?
Con JSONP, l'attributo src dell'elemento di script non fa riferimento a un file JavaScript, ma fa riferimento a un metodo Web (uno che può risiedere su un dominio diverso da cui è stato recuperato l'HTML). Questo metodo Web restituisce il codice JavaScript.
Il tag dello script presuppone che i dati restituiti siano un file JavaScript e lo eseguano normalmente. Tuttavia, ciò che effettivamente restituisce il metodo Web è una chiamata di funzione con un oggetto JSON letterale come parametro. Supponendo che la funzione chiamata sia definita, la funzione viene eseguita e può operare sull'oggetto JSON. Ad esempio, la funzione può estrarre i dati dall'oggetto JSON e associare tali dati al documento corrente.
I pro e contro di JSONP sono stati ampiamente discussi (rappresenta un problema di sicurezza molto serio), quindi non è necessario ripeterlo qui.
Quello che mi interessa è se qualcuno là fuori ha capito come usare JSONP con i server REST di DataSnap di Delphi. Ecco il problema, come vedo io. Un tipico utilizzo JSONP può includere un tag script che sembra qualcosa di simile:
<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
Il metodo Web GetData restituirebbe una chiamata qualcosa di simile al seguente:
workit({"id": "Delphi Pro", "price":999});
e la funzione Workit potrebbe essere simile questo:
function workit(obj) {
$("#namediv").val(obj.id);
$("#pricediv").val(obj.price);
}
Il problema è che DataSnap non sembra in grado di restituire una stringa semplice come
workit({"id": "Delphi Pro", "price":999});
Invece, è avvolto, come la seguente:
{"result":["workit({\"id\":\"Delphi Pro\",\"price\":999});"]}
Chiaramente questo non è eseguibile JavaScript.
Qualche idea?
la questione può essere ridotto a " DataSnap offre un filtro/hook/evento che consente di modificare la risposta JSON generata prima che venga inviata al client "? – mjn