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 mit GET
. 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:
- Erstellen Sie den JSON mit allen Filtern und normalisieren Sie ihn.
- Analysiere es in einen String
- Codiere es
- Senden Sie den verschlüsselten JSON als Request param (
/search?q=SGVsbG8gV29ybGQh....
).
- Dekodieren Sie serverseitig den Parameter q .
- Deserialisieren Sie die JSON-Zeichenfolge
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.
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.