从 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¶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 函数,如果可以,如何访问?如果没有,我还能如何请求 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¶meter2=wert2 并获得以下响应:
{
"parameter1" : "wert1",
"parameter2" : "wert2"
}
注意:此代码假定存在 v3.x,它添加了对 XQuery 3.1 的 JSON 支持的处理。 eXist 的早期版本可以序列化 JSON,但以特定于实现的方式。这里使用的 request
模块是特定于 eXist 的,因为没有广泛支持的跨平台模块用于接收 HTTP 请求;不过其他 XQuery 实现有一些变体。
我对 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¶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 函数,如果可以,如何访问?如果没有,我还能如何请求 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¶meter2=wert2 并获得以下响应:
{
"parameter1" : "wert1",
"parameter2" : "wert2"
}
注意:此代码假定存在 v3.x,它添加了对 XQuery 3.1 的 JSON 支持的处理。 eXist 的早期版本可以序列化 JSON,但以特定于实现的方式。这里使用的 request
模块是特定于 eXist 的,因为没有广泛支持的跨平台模块用于接收 HTTP 请求;不过其他 XQuery 实现有一些变体。