3 votes

Architecture REST/ROA - Envoyer les paramètres de recherche/requête/filtre/tri de la base de données dans l'URL ? (>, <, IN, etc...)

Je suis en train de construire une interface REST pour mon application en utilisant ROA (Resource Oriented Architecture).

J'aimerais donner au client la possibilité de spécifier des paramètres de recherche dans l'URL. Ainsi, un client pourrait dire "Donnez-moi toutes les personnes qui sont " :

  • "prénom" est égal à "BOB"
  • "age" est supérieur à "30"
  • trier par "nom_de_famille"

Je pensais à quelque chose comme :

GET /PEOPLE/{query_parameters}/{sort_parameters}

...ou peut-être

GET /PEOPLE?query=<query_string>&sort=<sort_string>

...mais je ne suis pas sûr de la syntaxe qui conviendrait pour spécifier les triples COLUMN_NAME-OPERATOR-VALUE. Je pensais à quelque chose comme :

column_name.operator.value

Le client pourrait donc dire :

GET /PEOPLE?query=first_name.EQUALS.bob&query=age.GREATER_THAN.30&sort=last_name.ASCENDING

Je ne veux vraiment pas réinventer la roue, mais existe-t-il des méthodes acceptées pour ce faire ? J'utilise Restlets, je ne sais pas si cela fait une différence.

2voto

manuel aldana Points 4317

J'ajouterais les paramètres de recherche en tant que paramètres individuels. Un langage de sous-requête dédié est souvent plus difficile à gérer et à lire (en particulier parce qu'il faut l'encoder en url), donc je n'écraserais pas un langage de syntaxe sql complet. N'ajoutez que les paramètres dont vous avez vraiment besoin et qui ont un sens pour la recherche, moins de complexité peut signifier une manipulation plus facile :)

J'ajouterais à ce même paramètre les éléments min/max. /people?age=10,20

Notez le ',', il vous offre implicitement une syntaxe de plage. Je trouve qu'il est plus lisible d'avoir minAge et maxAge.

pour une gamme ouverte que vous pourriez faire : /people?age=10,*

le tri que je ferais : /people?sortField=name&sortOrder=ascending

1voto

k_b Points 1688

J'opterais pour quelque chose comme ça :

GET /PEOPLE?first_name=bob&min_age=30&sort=last_name.asc,age.desc

Et attention aux injections SQL :)

1voto

Srikar Doddi Points 10611

Pourquoi ne pas envisager de faire de la recherche une ressource de premier ordre ? Voir ci-dessous, vous pouvez spécifier un objectType dans searchQuery pour indiquer que vous recherchez la ressource People.

/search/{searchQuery}

Par exemple, la requête ci-dessous indique une recherche sur toutes les personnes âgées de 30 à 50 ans.

/search?objectType=People&ageField1=30&ageField2=50&inclusive=true

Vous pouvez également faire la même chose avec le tri.

1voto

ajjain Points 253

J'ai mis à jour plus de détails et d'informations à ce sujet à l'adresse suivante http://nsinfra.blogspot.in/2011/12/simplifying-restful-search.html . Je pense que cela peut vous être utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X