2017-06-03 2 views
1

Ich bin ziemlich neu zu eXistDB, aber ich versuche, eine kleine App damit zu bauen.Anfrage JSON von existingDB

Ich bin mit einem JavaScript-Beispiel, das eine vorhandene JSON-Datei über jQuery anfordert, wenn mit dem folgenden Code benötigt:

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

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

Dies unabhängig von eXistDB gearbeitet, solange die JSON-Datei vorhanden ist. Was ich jetzt will, ist keine bestehende JSON-Datei zu laden, sondern eine eXist-Funktion wie app: getJSON aufzurufen, die ein dynamisch generiertes JSON-Objekt zurückgibt. Ich lese ein wenig über eXists JSON Serializer hier http://exist-db.org/exist/apps/wiki/blogs/eXist/XQuery31 und ich denke Ich werde es schaffen, ein JSON-Objekt in einer XQuery-Funktion zu erzeugen und zurückgeben, aber ich weiß nicht, wie eine solche Funktion per URL von meinem JavaScript (oder hier JQuery).

Meine gewünschte Lösung etwas würde wie folgt aussehen:

Java Script:

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

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

und dann in meinem app.xql würde ich möchte so etwas wie haben:

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:) 
}; 

So Die Frage kommt auf: Ist es möglich, über URL auf eine xQuery-Funktion zuzugreifen, und wenn ja, wie? Wenn nicht, wie sonst kann ich JSON-Daten anfordern, die aus meinen XML-Dateien mit JS/JQuery generiert werden? Ich weiß, das ist alles ziemlich vage und die Frage verrät, wie neu ich zu eXistDB bin, aber ich kann kein ähnliches Beispiel finden, das ich noch verstehen würde. Also vielleicht hat jemand eine Idee für mich, auch wenn es nur ein "Du solltest das wirklich lesen, dies und das" zuerst. Vielen Dank.

Antwort

1

Zum Erstellen eines Service, der JSON zurückgibt, würde ich empfehlen, eine eigenständige XQuery, z. B. getJSON.xq, zu erstellen und diese in Ihrer Anwendung zu speichern. (Ihre Probe app:getJSON() Funktion Unterschrift vorgeschlagen, dass Sie planten eXist HTML-Templating-Anlage zu nutzen, aber das Anlage wirklich ist gedacht für die HTML zu erzeugen.) Ihre getJSON.xq Datei konnte einfach aus dem folgenden Hauptmodul:

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 
    } 

Speicher dieses zu eine Sammlung wie /db/apps/getJSON.xq, werden Sie dann in der Lage sein http://localhost:8080/exist/apps/myapp/getJSON.xq?parameter1=wert1&parameter2=wert2 anrufen und folgende Antwort erhalten:

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

Hinweis: Dieser Code geht davon aus v3.x existieren, die für XQuery 3.1 JSON-Unterstützung Handhabung hinzugefügt. Frühere Versionen von eXist könnten JSON serialisieren, jedoch in einer implementierungsspezifischen Weise. Das hier verwendete request Modul ist eXist-spezifisch, da kein weit verbreitetes plattformübergreifendes Modul zum Empfangen von HTTP-Anfragen existiert; Andere XQuery-Implementierungen haben jedoch einige Varianten.

+0

Entschuldigung, nur jetzt zu antworten, ich habe dieses Projekt wegen der sehr begrenzten Zeit nicht lange gemacht. Perfekte Lösung, genau das, was ich wollte: D –

+0

Großartig, froh, es zu hören! – joewiz

+1

Ich bin jetzt in eine Situation geraten, in der ich Dutzende dieser xq-Dateien habe, von denen jede nur eine kleine Aufgabe ausführt, wie "diese XML-Datei in der Sammlung aktualisieren" oder "diese XML-Datei von hier nach dort kopieren". Ich möchte sie als ein Modul speichern, in dem jede der Aufgaben eine Funktion ist und dann wieder ... diese Funktionen assyncronous über JavaScript aufrufen. Aber wie? Ich meine: Gibt es irgendetwas, das HTTP-Anfragen irgendwie an xquery-Funktionen "abbildet"? –