API RESTful les paramètres requis dans la chaîne de requête?
Lors de la conception d'une API RESTful, que faire si une demande n'a de sens que si il y a des paramètres spécifiques associés à la demande? Si les paramètres se transmettre comme une chaîne de requête, et si oui, que faire lorsque tous les paramètres ne sont pas spécifiés ou sont mis en forme de façon incorrecte?
Par exemple, disons que j'ai un Post de ressources, qui peut être consulté par api/posts " point de terminaison. Chaque poste dispose d'une situation géographique et les articles peuvent être récupérés UNIQUEMENT lors de la spécification d'un domaine que les postes peuvent résider dans. Ainsi, 3 paramètres sont nécessaires: la latitude, la longitude et de rayon.
Je peux penser de 2 options dans ce cas:
1. Mettre les paramètres de chaîne de requête: api/posts/?lat=5.54158&lng=71.5486&radius=10
2. Mettre les paramètres dans l'URL: api/posts/lat/5.54158/lng/71.5486/radius/10
Qui devrait être la bonne approche? Il semble erroné de mettre les paramètres requis dans la chaîne de requête, mais cette dernière se sent un peu "plus laid'.
PS. Je suis au courant il y a beaucoup de discussion sur ce sujet déjà (par exemple: API REST Meilleures pratiques: Où mettre les paramètres?), mais ma question s'adresse spécifiquement au cas où les paramètres sont requis, pas une option.
OriginalL'auteur stensootla | 2015-02-18
Vous devez vous connecter pour publier un commentaire.
Par le REPOS de votre API doit remplir le RESTE les contraintes, qui sont décrits dans le Fielding thèse. L'une de ces contraintes est l'uniforme de la contrainte d'interface, qui comprend la HATEOAS contrainte. Selon le HATEOAS contrainte de votre API doivent servir à une norme de l'hypermédia comme format de réponse. Cette hypermédia contient des liens (par exemple, des liens HTML, formulaires) annoté avec des métadonnées (par exemple, relation de lien ou annotation RDF). Les clients de vérifier les métadonnées, qui explique ce qu'est le lien hypertexte. Après cela, ils peuvent décider s'ils veulent suivre le lien ou pas. Quand ils suivent le lien, ils peuvent construire la requête HTTP en fonction de l'URI du modèle, les paramètres, etc... et de l'envoyer au service REST.
Dans votre cas, il n'est pas question que la structure de l'URI que vous utilisez, il est pour l'utilisation du service, seulement, étant donné que le client utilise toujours le modèle URI et le client ne se soucie pas de ce qui est dans ce modèle jusqu'à ce qu'il est une URI valide modèle qui elle peut se remplir avec des paramètres.
Dans la plupart des cas, votre client dispose de suffisamment d'informations de validation pour vérifier si les paramètres sont incorrects ou manquants. Dans ce cas, il n'est pas d'envoyer une requête HTTP, donc vous n'avez rien à faire dans le service. Si une défaillance de param arrive, alors, dans votre cas, votre service renvoie un 404 - non trouvé, depuis l'URI est l'identificateur de ressource, et aucune ressource appartient à un URI non valide (généré à partir de la donnée modèle URI non valide, params).
Vous êtes à la droite "Le serveur n'a pas trouvé quelque chose correspondant à l'URI de Demande. Aucune indication n'est donnée si la condition est temporaire ou permanente." Donc dans ce cas 404 est la bonne réponse. 400 est mal formé du corps de la requête.
Je suis désolé, je n'ai pas très bien compris votre dernier commentaire. Vous dites que je dois passer les paramètres en tant que chaîne de requête (car les paramètres ne sont pas hiérarchiques) et lorsque certains d'entre eux sont manquants ou mal formaté, je doit envoyer une réponse avec un code d'état 404. Cependant, si vous regardez les autres stackoverflow question je l'ai mentionné dans mon commentaire précédent, le haut du répondeur, il dit expressément que, lorsque l'erreur 404 est retourné, les paramètres devraient être de la partie chemin de l'url, au lieu de chaîne de requête.
Je suppose que vous avez mal compris. 404 ne devrait pas avoir un corps. Je parlais de la forme de la description le client utilise pour construire l'URI, doit contenir les données de validation.
Oui, bien sûr, je suis à la validation des données côté client. Mais cela ne signifie pas que je ne devrais pas la conception de ma REST api pour gérer le cas lorsque des paramètres incorrects encore passer. Je pense que je suis absent de votre point de :d ?
OriginalL'auteur inf3rno
La première approche est la meilleure.
La deuxième approche est un peu trompeur.
Vous devriez penser à chacun de vos répertoires de ressources. Dans cette cause, le sous-ressources (par exemple: "api/posts/lat/5.54158") ne sont pas vraiment des ressources et donc trompeur. Il y a des cas où ce modèle est une meilleure solution, mais en regardant ce qui est donné, j'irais avec l'aide de la chaîne de requête. Sauf si vous avez une entité de liaison pour vous un lien directement vers cette URL, je n'aime pas vraiment ça.
OriginalL'auteur Isaiah van der Elst
Vous devez tout mettre dans la chaîne de requête et de définir le serveur renvoie un code d'erreur lorsque vous ne recevez pas les 3 paramètres requis.
Parce que c'est un groupe de paramètres qui permettent d'identifier un objet.
Prenant l'exemple:
lat=5.54158; lng=71.5486 rayon=10
Il serait très peu probable à cette url sens:
api/posts/lat/5.54158/lng/yyyy/radius/zz
C'est différent:
api/memb/35/..
parce que le membre ayant l'id 35 peut avoir beaucoup de fonctions ( donc, des url valides ):
api/memb/35/status
ouapi/memb/35/lastlogin
OriginalL'auteur user3413154