从 existDB 请求 JSON

Request JSON from existDB

我对 eXistDB 比较陌生,但我正在尝试用它构建一个小应用程序。

我正在使用 Java脚本示例,在需要时使用以下代码通过 jQuery 请求现有的 JSON 文件:

$.getJSON('path/to/file.json').
    done(function(data) {

        $.each(data, function(key, zone) {
            addRegion(zone, element);
        });
    });

只要存在 JSON 文件,无论 eXistDB 为何,这都有效。我现在想要的不是加载现有的 JSON 文件,而是调用像 app:getJSON 这样的 eXist 函数,其中 return 是一个动态生成的 JSON 对象。我在这里 http://exist-db.org/exist/apps/wiki/blogs/eXist/XQuery31 阅读了一些关于 eXists JSON 序列化程序的内容,我 认为 我将设法生成 return 一个 JSON 对象一个 XQuery 函数,但我不知道如何从我的 Java 脚本(或这里的 JQuery)通过 URL 调用这样的函数。

我想要的解决方案看起来有点像这样:

Java 脚本:

 $.getJSON('/app-getJSON?parameter1=wert1&parameter2=wert2').
    done(function(data) {

        $.each(data, function(key, zone) {
            addRegion(zone, element);
        });
    });

然后在我的 app.xql 中,我想要这样的东西:

declare function app:getJSON($node as node(), $model as map(*), $parameter1 as xs:string?, $parameter2 as xs:string?){
    (:here the JSON Object is generated from the XML collection and returned:)
};

所以问题归结为:是否可以通过 URL 访问 xQuery 函数,如果可以,如何访问?如果没有,我还能如何请求 JSON 从我的 XML 文件生成的 JS/JQuery 数据?我知道这一切都非常模糊,这个问题揭示了我对 eXistDB 有多陌生,但我找不到一个我能理解的类似例子。所以也许有人对我有想法,即使它只是第一个 "you should really read this, this and this"。 非常感谢。

为了创建 returns JSON 的服务,我建议创建一个独立的 XQuery,例如 getJSON.xq,并将其保存在您的应用程序中。 (您的示例 app:getJSON() 函数的签名表明您计划使用 eXist 的 HTML 模板工具,但该工具实际上是用于生成 HTML。)您的 getJSON.xq 文件可以简单地包含以下主要模块的:

xquery version "3.1";

declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method "json";
declare option output:media-type "application/json";

let $p1 := request:get-parameter('parameter1', ())
let $p2 := request:get-parameter('parameter2', ())
return
    map {
        "parameter1": $p1,
        "parameter2": $p2
    }

将其保存到像 /db/apps/getJSON.xq 这样的集合中,然后您将能够调用 http://localhost:8080/exist/apps/myapp/getJSON.xq?parameter1=wert1&parameter2=wert2 并获得以下响应:

{
    "parameter1" : "wert1",
    "parameter2" : "wert2"
}

注意:此代码假定存在 v3.x,它添加了对 XQuery 3.1 的 JSON 支持的处理。 eXist 的早期版本可以序列化 JSON,但以特定于实现的方式。这里使用的 request 模块是特定于 eXist 的,因为没有广泛支持的跨平台模块用于接收 HTTP 请求;不过其他 XQuery 实现有一些变体。