似乎没有办法使用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/

10-12 00:16
查看更多