2016-05-11 19 views
0

Ich habe eine einfache erholsame API für Destinationen. Es ist mit Express gebaut und Sequelize mit einer MySQL-Datenbank. Es hat Städte, Länder und Regionen. Städte gehören zu Ländern, die zu Regionen gehören.RESTful API komplexe Abfragen

Jetzt ist es üblich, dass ich komplexe Suchoperationen durchführen muss. Zum Beispiel:

GET/Städte

{ 
    where: { 
    name: {'$like': 'bue%'} 
    }, 
    include: [{model: Country, where: {region_id: 1}}] 
} 

Damit ich alle Städte zu holen versuchen, wo der Name mit ‚bue‘ beginnt, aber nur Land region_id, deren 1. Dieser Schritt ergriffen werden könnte, Weiterleiten, wenn ich angeben, welche Felder ich zurückgeben möchte. Die Modelle haben einige Textfelder, die ich möglicherweise nicht benötige, daher lautet die obige Abfrage wie folgt:

Dies ist bereits ziemlich komplex. Image, wenn ich die Region des Landes einschließen und dort auch einige Filter hinzufügen möchte.

Also, meine Frage ist: Wie gehe ich über die Weitergabe dieser komplexen Abfrage? Momentan verwende ich URL-Params mit codierten JSON. So habe ich so etwas wie:

where: {name: {'$like': 'bue%'}} => Becomes: 

/cities?where=%7Bname%3A%20%7B%27%24like%27%3A%20%27bue%25%27%7D%7D 

Sie können sehen, dass dies zu einer verdammt hässlich URL, die ziemlich hart zu arbeiten. Wenn meine Abfrage komplex ist, wird die URL zu einem Monster. Wenn mein where Parameter wie OR/AND und komplexe Bedingungen, wird es wirklich groß und chaotisch.

Wie auch immer, das ist die Frage. Soll ich die Dinge so behalten wie sie sind? Gibt es einen geeigneteren Weg, dies irgendwie zu tun? Ein Beispiel würde geschätzt werden.

Antwort

0

Eine der "Standard" -Lösungen besteht darin, die komplexe Abfrage (mit der Abfrage im HTTP-Body) zu POST zu stellen, sie vom Server irgendwo speichern zu lassen und eine neue URL zurückzugeben, die auf die gespeicherte Abfrage verweist. Danach können Clients ein GET für die neue Abfrage-URL ausgeben, um das Ergebnis zu erhalten.

+0

Das sieht weit hergeholt als einfach den codierten JSON in den Abfrageparams senden. – yBrodsky