有没有办法将JSONP与Delphi DataSnap REST服务器一起使用?

Car*_*sen 7 delphi rest jsonp datasnap delphi-xe

似乎没有办法使用DataSnap 实现JSONP(带填充的JSON)解决方案,但我想在这里抛出这个问题以防有人解决了这个问题.

背景:JSONP是一种利用HTML脚本元素的跨站点引用功能来克服XmlHttpRequest类的相同原始策略的机制.使用XmlHttpRequest,您只能从提供HTML文档的同一域中获取数据(JSON对象).但是,如果您想从多个站点检索数据并将该数据绑定到浏览器中的控件,该怎么办?

使用JSONP,脚本元素的src属性不引用JavaScript文件,而是引用Web方法(可以驻留在检索HTML的不同域上的方法).此Web方法返回JavaScript.

脚本标记假定返回的数据是JavaScript文件并正常执行.但是,Web方法实际返回的是一个函数调用,其中有一个文字JSON对象作为其参数.假设已定义调用的函数,该函数将执行并可对JSON对象进行操作.例如,该函数可以从JSON对象中提取数据并将该数据绑定到当前文档.

JSONP的优点和缺点已被广泛争论(它代表了一个非常严重的安全问题),因此没有必要在此重复.

我感兴趣的是,如果有人知道如何将JSONP与Delphi的DataSnap REST服务器一起使用.正如我所看到的,这就是问题所在.典型的JSONP用法可能包含一个类似于以下内容的脚本标记:

<script type="application/javascript" src="http://someserver.com/getdata?callback=workit"> </script>
Run Code Online (Sandbox Code Playgroud)

getdata Web方法将返回如下所示的调用:

workit({"id": "Delphi Pro", "price":999});
Run Code Online (Sandbox Code Playgroud)

而workit函数可能看起来像这样:

function workit(obj) {
  $("#namediv").val(obj.id);
  $("#pricediv").val(obj.price);
}
Run Code Online (Sandbox Code Playgroud)

问题是DataSnap似乎不能返回像这样的简单字符串

workit({"id": "Delphi Pro", "price":999});
Run Code Online (Sandbox Code Playgroud)

相反,它被包装,如下所示:

{"result":["workit({\"id\":\"Delphi Pro\",\"price\":999});"]}
Run Code Online (Sandbox Code Playgroud)

显然这不是可执行的JavaScript.

有任何想法吗?

Mar*_*ntù 9

Delphi DataSnap REST方法中有一种方法可以绕过自定义JSON处理并返回您想要的JSON.这是我使用的一个类函数(在我的Relax框架中)将纯数据返回到jqGrid:

class procedure TRlxjqGrid.SetPlainJsonResponse(jObj: TJSONObject);
begin
  GetInvocationMetadata().ResponseCode := 200;
  GetInvocationMetadata().ResponseContent := jObj.ToString;
end;
Run Code Online (Sandbox Code Playgroud)

有关详情,请访问http://blogs.embarcadero.com/mathewd/2011/01/18/invocation-metadata/.

顺便说一下,你可以为REST函数的结果分配nil.