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 garantire che gli sviluppatori sappiano che le richieste POST /search
sono sicure.
Detto ciò.
1. Dai la possibilità di OTTENERE
Considera GET
prima l' opzione. Dai un'occhiata alla lunghezza massima di questa domanda URL . Valuta se la stringa di query più lunga è più lunga di 2000 caratteri. In caso contrario, e non ti aspetti che lo sia, vai con GET
. Potrebbe sembrare brutto, ma almeno puoi aggiungere l'URL ai segnalibri e, ovviamente, ha tutti i vantaggi derivati dalla semantica del metodo (idempotenza, sicurezza e memorizzazione nella cache)
1.1 Prova a codificare la stringa di query
Ad esempio, nella base 64. Anche javascript supporta la codifica base 64 .
Funziona così:
- Crea il JSON con tutti i filtri e normalizzalo.
- Analizzalo su stringa
- Codificalo
- Invia il JSON codificato come parametro di richiesta (
/search?q=SGVsbG8gV29ybGQh....
).
- Sul lato server, decodifica il parametro q .
- Deserializza la stringa JSON
In precedenza, crea la stringa JSON più lunga possibile, codificala e prendine la lunghezza. Valuta se la stringa codificata si adatta all'URL. Ho implementato il seguente frammento su Fiddle.js per testarlo. (Spero che funzioni ancora) 1
I codifiche Base 64 sono deterministici e reversibili, quindi non c'è possibilità di collisioni.
Con le query codificate, potremmo anche salvare le ricerche nel DB, aggiungere l'URL ai segnalibri, condividere i collegamenti, ecc. E, naturalmente, non dobbiamo scappare / annullare il escape della stringa.
1.2 Prova con gli alias
Leggendo questo blog su come progettare le API REST, ho ricordato un'altra alternativa. Alias per query comuni .
Trovo che questi siano interessanti per i prossimi motivi
Ridurre la lunghezza della stringa di query. Rende l'API più pulita e intuitiva
GET / ticket /? Status = chiuso e chiuso At = xxx vs
GET / biglietti / recentemente chiuso /
Combinabile con più alias o più parametri di richiesta.
OTTIENI / biglietti /? Stato = chiuso e chiuso At = xxx e entro = 30 minuti vs
OTTIENI / biglietti / recentemente chiusi /? Entro = 30 minuti
Siamo in grado di combinare alias con stringhe di query codificate
GET / ticket /? Status = chiuso e chiuso At = xxx e entro = 30 minuti vs
GET / ticket / recentemente chiuso /? Q = SGVsbG8g ...
1: ho usato JSON, ma potremmo usare altri formati non appena possiamo deserializzarlo sul lato server.
search?q=t
,search?q=te
,search?q=test
e così via. Valuta di limitare la frequenza di invio della query per evitare di danneggiare il tuo server. In alternativa, potresti anche restituire una grande quantità di informazioni e sul lato client fare il filtro. Funziona bene se l'utente inserisce ampie categorie che possono restringere notevolmente le cose.