似乎没有办法使用 DataSnap 实现JSONP(带填充的 JSON)解决方案,但我想在这里提出这个问题,以防有人解决了这个问题。
背景:JSONP 是一种利用 HTML 脚本元素的跨站点引用能力来克服 XmlHttpRequest 类的同源策略的机制。使用 XmlHttpRequest,您只能从提供 HTML 文档的同一域中获取数据(JSON 对象)。但是,如果您想从多个站点检索数据并将该数据绑定到浏览器中的控件,该怎么办?
使用 JSONP,脚本元素的 src 属性不会引用 JavaScript 文件,而是引用 Web 方法(可以驻留在检索 HTML 的不同域中的方法)。此 Web 方法返回 JavaScript。
script 标签假定返回的数据是一个 JavaScript 文件并正常执行。然而,Web 方法实际返回的是一个以文字 JSON 对象作为参数的函数调用。假设定义了调用的函数,该函数执行并可以对 JSON 对象进行操作。例如,该函数可以从 JSON 对象中提取数据并将该数据绑定到当前文档。
JSONP 的优劣已经被广泛争论(它代表了一个非常严重的安全问题),所以这里没有必要重复。
我感兴趣的是是否有人知道如何将 JSONP 与 Delphi 的 DataSnap REST 服务器一起使用。正如我所看到的,这就是问题所在。一个典型的 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。
有任何想法吗?