【发布时间】:2011-10-06 20:56:12
【问题描述】:
似乎没有办法使用 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。
有什么想法吗?
【问题讨论】:
-
问题可以简化为“DataSnap 是否提供过滤器/挂钩/事件,允许在生成的 JSON 响应发送到客户端之前对其进行修改”?
标签: delphi rest jsonp delphi-xe datasnap