似乎没有办法使用DataSnap来实现JSONP(带有填充的JSON)解决方案,但是如果有人解决了这个问题,我想在此扔掉这个问题。
背景:JSONP是一种利用HTML脚本元素的跨站点引用功能来克服XmlHttpRequest类的相同原始策略的机制。使用XmlHttpRequest只能从提供HTML文档的同一域中获取数据(JSON对象)。但是,如果要从多个站点检索数据并将该数据绑定(bind)到浏览器中的控件怎么办?
使用JSONP,您的script元素的src属性不引用JavaScript文件,而是引用Web方法(该方法可以驻留在从中检索HTML的其他域中)。此Web方法返回JavaScript。
script标签假定返回的数据是JavaScript文件,并正常执行。但是,Web方法实际上返回的是一个以文字JSON对象作为其参数的函数调用。假设已定义调用的函数,该函数将执行并可以在JSON对象上运行。例如,该函数可以从JSON对象提取数据并将该数据绑定(bind)到当前文档。
JSONP的优缺点已被广泛争论(这代表了一个非常严重的安全性问题),因此无需在此重复。
我感兴趣的是,是否有人想出如何在Delphi的DataSnap REST服务器中使用JSONP。正如我所看到的,这就是问题所在。典型的JSONP用法可能包括一个脚本标签,看起来像这样:
<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
Web Web getdata方法将返回如下调用:
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。
有任何想法吗?
最佳答案
Delphi DataSnap REST方法中有一种方法可以绕过自定义JSON处理并完全返回所需的JSON。这是我使用的类函数(在我的Relax框架中),将纯数据返回到jqGrid:
class procedure TRlxjqGrid.SetPlainJsonResponse(jObj: TJSONObject);
begin
GetInvocationMetadata().ResponseCode := 200;
GetInvocationMetadata().ResponseContent := jObj.ToString;
end;
信息http://blogs.embarcadero.com/mathewd/2011/01/18/invocation-metadata/。
信息https://mathewdelong.wordpress.com/2011/01/18/invocation-metadata/。
顺便说一句,您可以为REST函数的结果分配nil。
关于delphi - 是否可以在Delphi DataSnap REST服务器上使用JSONP?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6719640/