gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:49:50 27 4
gpt4 key购买 nike

看来没有办法实现 JSONP (JSON with Padding) 使用 DataSnap 的解决方案,但我想在这里抛出这个问题,以防有人解决了这个问题。

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

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

script标签假设返回的数据是JavaScript文件,并正常执行。然而,Web 方法实际上返回的是一个以文本 JSON 对象作为参数的函数调用。假设定义了所调用的函数,则该函数将执行并可以对 JSON 对象进行操作。例如,该函数可以从 JSON 对象中提取数据并将该数据绑定(bind)到当前文档。

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。

有什么想法吗?

最佳答案

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/ .

顺便说一句,您可以将 nil 分配给 REST 函数的结果。

关于delphi - 有没有办法将 JSONP 与 Delphi DataSnap REST 服务器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719640/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com