Prima di leggere la mia risposta, vorrei dire che sono d'accordo con @Neil. Dobbiamo scegliere le nostre battaglie. Di solito vogliamo fare del nostro meglio, ma a volte c'è troppo poco spazio per la discussione e dobbiamo prendere decisioni contro la nostra volontà.
Comunque, nella risposta di Neil, mi manca ancora una cosa. Documentazione . Solo per assicurarti che gli sviluppatori sappiano che le richieste POST a /search
sono sicure.
Detto questo.
1. Dai la possibilità di ottenere
Considera prima l'opzione GET
. Dai un'occhiata a questa domanda la lunghezza massima dell'URL . Valutare se la stringa di query più lunga è più lunga di 2000 caratteri. Se non lo fa, e non ti aspetti che sia, vai con GET
. Potrebbe sembrare brutto, ma almeno puoi aggiungere l'URL ai segnalibri e, naturalmente, ha tutti i vantaggi derivati dalla semantica del metodo (idempotence, safe e caching)
1.1 Prova a codificare la stringa di query
Ad esempio, nella base 64. Anche javascript supporta le codifiche di base 64 .
Ecco come funziona:
- Costruisci il JSON con tutti i filtri e normalizzalo.
- Analizzalo su stringa
- Codifica
- Invia il JSON codificato come parametro della richiesta (
/search?q=SGVsbG8gV29ybGQh....
).
- Sul lato server, decodifica il parametro q .
- Deserializza la stringa JSON
In precedenza, crea la stringa JSON più lunga possibile, codificale e prendi la lunghezza. Valutare se la stringa codificata si adatta all'URL. Ho implementato il seguente snippet su Fiddle.js per il test. (Spero funzioni ancora) 1
Le codifiche Base 64 sono deterministiche e reversibili, quindi non c'è possibilità di collisioni.
Con le query codificate, potremmo anche salvare le ricerche nel DB, aggiungere un segnalibro all'URL, condividere link, ecc. E, naturalmente, non dobbiamo sfuggire / rimuovere la stringa.
1.2 Prova con alias
Leggendo questo blog su come progettare le API REST, ne ho ricordato uno più alternativa. Alias per query comuni .
Trovo che questi siano interessanti per alcuni motivi:
-
Riduci la lunghezza della stringa della query. Rende le API più pulite e facili da usare
GET / ticket /? status = chiuso & chiuso; chiuso = xxx vs
GET / ticket / chiudi di recente /
-
Combinabile con più alias o più parametri di richiesta.
GET / ticket /? status = chiuso & chiuso; chiuso = xxx & within = 30min vs
GET / ticket / chiudi di recente /? Within = 30min
-
Potremmo combinare alias con stringhe di query codificate
GET / ticket /? status = chiuso & chiuso; chiuso = xxx & within = 30min vs
GET / ticket / chiudi di recente /? Q = SGVsbG8g ...
1: Ho usato JSON, ma potremmo usare altri formati non appena possiamo deserializzare sul lato server.