Nach den REST-Grundsätzen möchte ich eine GET-Methode für meine API erstellen, die anhand einiger Kriterien eine Suche durchführt und die Ergebnisse an den Client zurückgibt. Das Problem ist, dass die Kriterien bis zu 14 Parameter haben können, von denen einer eine Liste komplexer Objekte ist.
Ich weiß nicht einmal, ob es möglich ist, diese komplexen Objekte in URL-Parameter zu kodieren / zu dekodieren.
Ich habe nicht berechnet, wie lange die URL dauern kann, bin mir aber sicher, dass sie groß genug ist und möglicherweise die maximale URL-Länge erreicht.
Außerdem sollte die Suche die Ergebnisse in "Echtzeit" anzeigen. Ich meine, jedes Mal, wenn der Benutzer etwas in der Suchmaske ändert, sollte er in der Lage sein, die neuen Ergebnisse zu sehen, ohne die Schaltfläche "Suchen" zu drücken.
Könnten Sie mir diese Punkte erläutern und was würden Sie raten, um eine erholsame Suchmethode mit vielen Parametern zu erstellen?
search?q=t
,search?q=te
,search?q=test
, und so weiter. Überlegen Sie, wie oft die Abfrage gesendet wird, um den Server nicht zu beschädigen. Alternativ können Sie auch viele Informationen zurückgeben und clientseitig filtern. Das funktioniert gut, wenn der Benutzer breite Kategorien eingibt, die die Dinge stark einschränken können.Antworten:
Bevor Sie meine Antwort lesen, möchte ich sagen, dass ich mit @Neil einverstanden bin. Wir müssen unsere Schlachten auswählen. Wir wollen normalerweise unser Bestes geben, aber manchmal gibt es zu wenig Raum für Diskussionen und wir müssen Entscheidungen gegen unseren Willen treffen.
Wie auch immer, in Neils Antwort vermisse ich noch eine Sache. Dokumentation . Nur um sicherzustellen, dass Entwickler wissen, dass POST-Anforderungen
/search
sicher sind.Das gesagt.
1. Gib GET eine Chance
Betrachten Sie zuerst die
GET
Option. Überprüfen Sie die maximale Länge dieser Fragen- URL . Bewerten Sie, ob Ihre längste Abfragezeichenfolge länger als 2000 Zeichen ist. Wenn dies nicht der Fall ist und Sie dies nicht erwarten, gehen Sie mitGET
. Es mag hässlich erscheinen, aber zumindest können Sie die URL mit einem Lesezeichen versehen und natürlich hat es alle Vorteile, die sich aus der Semantik der Methode ergeben (Idempotenz, Sicherheit und Caching).1.1 Versuchen Sie, die Abfragezeichenfolge zu codieren
Zum Beispiel in Base 64. Auch JavaScript unterstützt Base 64-Codierungen .
So funktioniert es:
/search?q=SGVsbG8gV29ybGQh....
).Machen Sie vorher den längsten möglichen JSON-String, kodieren Sie ihn und nehmen Sie die Länge. Bewerten Sie, ob die codierte Zeichenfolge in die URL passt. Ich habe das folgende Snippet auf Fiddle.js implementiert, damit Sie es testen können. (Ich hoffe es funktioniert immer noch) 1
Base-64-Codierungen sind deterministisch und reversibel, sodass Kollisionen ausgeschlossen sind.
Mit verschlüsselten Abfragen können wir auch Suchvorgänge in der Datenbank speichern, die URL mit einem Lesezeichen versehen, Links freigeben usw. Und natürlich müssen wir die Zeichenfolge nicht entschlüsseln / entschlüsseln.
1.2 Versuchen Sie es mit Aliasen
Als ich diesen Blog über das Entwerfen von REST-APIs las, fiel mir eine weitere Alternative ein. Aliase für häufig gestellte Fragen .
Ich finde diese aus den nächsten Gründen interessant
Kürzen Sie die Länge der Abfragezeichenfolge. Es macht die API sauberer und benutzerfreundlicher
GET / tickets /? Status = closed & closedAt = xxx vs GET / tickets / kürzlich geschlossen /
Kombinierbar mit mehr Aliasen oder mehr Anforderungsparametern.
GET / tickets /? Status = closed & closedAt = xxx & within = 30min vs GET / tickets / recent -closed /? Within = 30min
Wir können Aliase mit codierten Abfragezeichenfolgen kombinieren
GET / tickets /? Status = closed & closedAt = xxx & within = 30min vs GET / tickets / kürzlich geschlossen /? Q = SGVsbG8g ...
1: Ich habe JSON verwendet, aber wir könnten andere Formate verwenden, sobald wir es serverseitig deserialisieren können.
quelle
Wenn Sie nur einen Hammer haben, sieht alles aus wie ein Nagel. Es scheint, dass das Problem darin besteht, dass Sie versuchen, eine Suchseite in eine REST-konforme zu verwandeln, und dies scheint kaum ein gängiges Muster für REST-konformes Design zu sein.
Gehen Sie einfach mit einer POST-Anfrage mit vom Benutzer angegebenen Parametern, um die benötigten Informationen aus dem Backend zu erhalten. Ich gehe davon aus, dass Sie nichts anderes tun müssen, als eine Suche durchzuführen. Es besteht also keine Chance, dass Sie diese Seite durchblättern müssen. Fügen Sie einfach ein / search am Ende Ihrer URL hinzu, damit Sie nicht in Konflikte mit Ihrer / users-Seite geraten, die RESTful wären .
quelle
Es hängt ganz davon ab, welches API-Modell Sie verwenden: Als keines oder als Verb.
Wenn die API keine ist, möchten Sie möglicherweise eine Liste der Objekte wie folgt abrufen:
In diesem Fall müssen Sie Daten als Anforderungsparameter senden. Sie müssen Ihre Parameter also als eine flache Liste von Schlüsselwerten beschreiben:
Einige Plattformen unterstützen benutzerdefinierte Parameter-Resolver (z. B. Spring MVC), und Sie können Parameter in ein Objekt konvertieren.
quelle