似乎没有办法使用DataSnap来实现带有Padding的JSONP(JSON)解决方案,但是我想在这里抛出这个问题以防有人解决了这个问题。有没有办法在Delphi DataSnap REST服务器上使用JSONP?
背景:JSONP是一种利用HTML脚本元素的跨站点引用功能来克服XmlHttpRequest类的相同源策略的机制。使用XmlHttpRequest,您只能从HTML文档提供的相同域中获取数据(JSON对象)。但是如果你想从多个站点检索数据并将数据绑定到浏览器中的控件呢?
使用JSONP,脚本元素的src属性不引用JavaScript文件,而是引用Web方法(可驻留在检索到HTML的不同域上的Web方法)。这个Web方法返回JavaScript。
脚本标签假定返回的数据是一个JavaScript文件并正常执行。但是,Web方法实际返回的是以文字JSON对象作为参数的函数调用。假定被调用的函数是被定义的,该函数执行并且可以在JSON对象上运行。例如,该函数可以从JSON对象提取数据并将该数据绑定到当前文档。
JSONP的优缺点已被广泛讨论(它代表了一个非常严重的安全问题),所以在这里没有必要重复说明。
我感兴趣的是如果有人已经找到了如何在Delphi的DataSnap REST服务器上使用JSONP。就像我看到的那样,问题就在这里。一个典型的JSONP使用可能包括脚本标记看起来是这样的:
的的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。
任何想法?
+2
这个问题可以降低到“ DataSnap提供了一个过滤器/钩子/事件,它允许在发送给客户端之前修改生成的JSON响应“? –