Avant de lire ma réponse, je voudrais dire que je suis d’accord avec @Neil. Nous devons choisir nos batailles. Nous voulons généralement faire de notre mieux, mais il y a parfois trop peu de place pour la discussion et nous devons prendre des décisions contre notre volonté.
Quoi qu'il en soit, dans la réponse de Neil, il me manque une dernière chose. Documentation . Juste pour s'assurer que les développeurs savent que les requêtes POST /search
sont sécurisées.
Cela dit.
1. Donner une chance d'obtenir
Considérons l' GET
option en premier. Découvrez la longueur maximale de cette question dans l' URL . Déterminez si votre chaîne de requête la plus longue contient plus de 2 000 caractères. Si ce n'est pas le cas, et que vous ne vous attendez pas à cela, allez-y GET
. Cela peut paraître moche, mais au moins vous pouvez marquer l’URL en signet et, bien sûr, elle présente tous les avantages dérivés de la sémantique de la méthode (idempotence, safe et mise en cache).
1.1 Essayez d'encoder la chaîne de requête
Par exemple, en base 64. Même javascript prend en charge les encodages en base 64 .
Voici comment cela fonctionne:
- Construisez le JSON avec tous les filtres et normalisez-le.
- Analyse le en chaîne
- L'encoder
- Envoyez le JSON codé en tant que request param (
/search?q=SGVsbG8gV29ybGQh....
).
- Côté serveur, décodez le paramètre q .
- Désérialiser la chaîne JSON
Auparavant, créez la chaîne JSON la plus longue possible, encodez-la et prenez la longueur. Évaluez si la chaîne encodée tient dans l'URL. J'ai implémenté l'extrait suivant sur Fiddle.js pour que vous puissiez le tester. (J'espère que cela fonctionne toujours) 1
Les codages en base 64 sont déterministes et réversibles, il n’ya donc aucune chance de collision.
Avec les requêtes codées, nous pourrions également enregistrer des recherches dans la base de données, marquer l’URL du signet, partager des liens, etc. Et, bien sûr, nous n’avons pas à échapper / annuler la chaîne.
1.2 Essayez avec des alias
En lisant ce blog sur la conception des API REST, je me suis rappelé une alternative supplémentaire. Alias pour les requêtes courantes .
Je trouve cela intéressant pour les prochaines raisons
Raccourcissez la longueur de la chaîne de requête. Cela rend l'API plus propre et conviviale
GET / tickets /? Status = fermé & ferméAt = xxx vs
GET / billets / récemment fermé /
Combinable avec plus d'alias ou plus de paramètres de demande.
GET / tickets /? Status = fermé & ferméAt = xxx & dans = 30min vs
GET / billets / récemment fermé /? Dans = 30min
Nous pouvons combiner des alias avec des chaînes de requête codées
GET / tickets /? Status = fermé & ferméAt = xxx & dans = 30min vs
GET / billets / récemment fermé /? Q = SGVsbG8g ...
1: J'ai utilisé JSON, mais nous pourrions utiliser d'autres formats dès que nous pourrons le désérialiser sur le serveur.
search?q=t
,search?q=te
,search?q=test
et ainsi de suite. Envisagez de limiter la fréquence d'envoi de la requête pour éviter de nuire à votre serveur. Vous pouvez également renvoyer beaucoup d’informations et filtrer du côté client. Cela fonctionne bien si l’utilisateur entre de grandes catégories qui permettent de réduire considérablement les choses.