2017-06-03 57 views
1

我對eXistDB相當陌生,但我正在嘗試使用它創建一個小應用程序。從existsDB請求JSON

我使用在需要時用下面的代碼通過jQuery要求現有的JSON文件中的JavaScript例如:

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

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

這隻要JSON文件存在,無論eXistDB的工作。我現在想要的不是加載現有的JSON文件,而是調用一個eXist函數,如app:getJSON,它返回一個動態生成的JSON對象。我讀了一些關於eXists JSON序列化器在這裏http://exist-db.org/exist/apps/wiki/blogs/eXist/XQuery31和我認爲我將設法產生並返回一個JSON對象在XQuery函數中,但我不知道如何通過來自我的JavaScript的URL調用這樣的函數(或者這裏是JQuery )。

我期望的解決辦法看起來有點像這樣:

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函數,如果可以,如何實現?如果沒有,我還可以請求通過JS/JQuery從我的XML文件生成的JSON數據?我知道這是非常模糊的,這個問題給了我新的eXistDB,但我找不到一個我可以理解的類似示例。所以,也許有人對我有一個想法,即使它只是一個「你應該真正閱讀這個,這個和這個」的第一個。 非常感謝。

回答

1

爲了創建一個返回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" 
} 

注:此代碼假定eXist的3.x版,它增加了處理的XQuery爲3.1的JSON支持。早期版本的eXist可以序列化JSON,但是採用特定於實現的方式。這裏使用的request模塊是特定於eXist的,因爲沒有廣泛支持的用於接收HTTP請求的跨平臺模塊;但其他XQuery實現也有一些變體。

+0

對不起,現在只回復,因爲時間非常有限,我沒有繼續這個項目。完美的解決方案,正是我想要的:D –

+0

太棒了,很高興聽到它! – joewiz

+1

我現在陷入了一種情況,我有幾十個這樣的xq文件,其中每個文件只做一個小任務,比如「更新集合中的這個xml文件」或者「將這個xml文件從這裏複製到那裏」。我想將它們存儲爲一個模塊,其中每個任務都是一個函數,然後再次...通過JavaScript調用這些函數。但是如何?我的意思是說:有什麼能夠將http請求映射到xquery函數? –