我对eXistDB很新,但我正在尝试用它构建一个小应用程序。
我正在使用一个JavaScript示例,在需要时使用以下代码通过jQuery请求现有的JSON文件:
$.getJSON('path/to/file.json').
done(function(data) {
$.each(data, function(key, zone) {
addRegion(zone, element);
});
});
只要存在JSON文件,无论eXistDB如何,这都有效。我现在想要的,不是加载现有的JSON文件,而是调用像app:getJSON这样的eXist函数,它返回一个动态生成的JSON对象。我在这里阅读了一些关于eXists JSON序列化程序http://exist-db.org/exist/apps/wiki/blogs/eXist/XQuery31并且我认为我将设法在XQuery函数中生成并返回一个JSON对象,但我不知道如何调用这样的函数通过我的JavaScript(或这里的JQuery)的URL。
我想要的解决方案看起来有点像这样:
Java脚本:
$.getJSON('/app-getJSON?parameter1=wert1¶meter2=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函数,如果是,如何?如果没有,我还能如何通过JS / JQuery请求从我的XML文件生成的JSON数据?我知道这一切都很模糊,问题是我对eXistDB有多新,但是我找不到一个我能理解的类似例子。所以也许有人对我有一个想法,即使它只是一个“你应该真正读到这个,这个和这个”的第一个。 非常感谢。
答案 0 :(得分:3)
为了创建一个返回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¶meter2=wert2并获得以下回复:
{
"parameter1" : "wert1",
"parameter2" : "wert2"
}
注意:此代码假定为eXist v3.x,它增加了对XQuery 3.1的JSON支持的处理。早期版本的eXist可以序列化JSON,但是以特定于实现的方式。此处使用的request
模块是特定于eXist的,因为没有广泛支持的跨平台模块用于接收HTTP请求;其他XQuery实现虽然有一些变体。