En suivant les principes de REST, je souhaiterais créer une méthode GET pour mon API qui effectue une recherche à l'aide de certains critères et renvoie les résultats au client. Le problème est que les critères peuvent avoir jusqu'à 14 paramètres, l'un d'eux est une liste d'objets complexes, donc ...
Je ne sais même pas s'il est possible de coder / décoder ces objets complexes dans / à partir de paramètres d'URL.
Je n'ai pas calculé combien de temps l'URL pourrait avoir mais je suis sûr que ce sera assez grand et peut-être atteindre la limite de longueur d'URL?
En outre, la recherche devrait afficher les résultats en "temps réel", je veux dire, chaque fois que l'utilisateur modifie quelque chose à partir du formulaire de recherche, il devrait pouvoir voir les nouveaux résultats sans appuyer sur le bouton "Rechercher".
Pourriez-vous m'expliquer ces points et quel conseil donneriez-vous pour créer une méthode de recherche reposante avec beaucoup de paramètres?
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.Réponses:
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-yGET
. 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:
/search?q=SGVsbG8gV29ybGQh....
).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.
la source
Si tout ce que vous avez est un marteau, tout ressemble à un clou. Il semble que le problème ici est que vous essayez de transformer une page de recherche en une page RESTful, ce qui semble difficilement être un motif courant pour la conception RESTful.
Il suffit simplement d’obtenir une requête POST avec les paramètres fournis par l’utilisateur pour obtenir les informations dont vous avez besoin à partir du backend. Je suppose que vous n'avez pas besoin de faire autre chose que d'effectuer une recherche. Il est donc inutile d'insérer cette page dans cette page. Ajoutez simplement un / search à la fin de votre URL pour ne pas risquer de vous heurter à des conflits avec votre page / users qui seraient RESTful.
la source
Cela dépend entièrement de votre modèle d'API: en tant que rien ou en tant que verbe.
Si l'API est non, alors vous voudrez peut-être obtenir une liste d'objets comme suit:
Dans ce cas, vous devez envoyer les données en tant que paramètres de demande. Vous devez donc décrire vos paramètres sous forme de liste plate de valeurs-clés:
Certaines plates-formes prennent en charge le résolveur de paramètres personnalisé (par exemple, Spring MVC), et vous pouvez convertir les paramètres en objet.
la source