Reposant URL de conception pour la recherche
Je suis à la recherche d'un moyen raisonnable de représenter les recherches comme une bonne Url.
L'installation: j'ai deux modèles, les Voitures et les Garages, où les Voitures peuvent être dans les Garages. Donc, mon url comme:
/car/xxxx
xxx == car id
returns car with given id
/garage/yyy
yyy = garage id
returns garage with given id
Une Voiture peut exister sur son propre (d'où le /voiture), ou il peut exister dans un garage. Quelle est la bonne manière de représenter, dire que toutes les voitures dans un garage? Quelque chose comme:
/garage/yyy/cars ?
Comment au sujet de l'union de voitures dans le garage yyy et zzz?
Quelle est la bonne façon de représenter une recherche pour les voitures avec certains de ses attributs? Dire: montrez-moi tout bleu berline avec 4 portes :
/car/search?color=blue&type=sedan&doors=4
ou devrait-il être /voitures place?
L'utilisation de "recherche" semble inapproprié y - ce qui est un meilleur moyen /long terme? Devrait-il être juste:
/cars/?color=blue&type=sedan&doors=4
Devrait les paramètres de recherche de la partie de la PATHINFO ou QUERYSTRING?
En bref, je suis à la recherche de conseils pour la croix-modèle RESTE url de conception, et pour la recherche.
[Mise à jour] j'aime Justin réponse, mais il ne couvre pas le multi-domaine de recherche de cas:
/cars/color:blue/type:sedan/doors:4
ou quelque chose comme ça. Comment allons-nous partir d'
/cars/color/blue
aux multiples sur le terrain?
- Bien qu'il semble de mieux en anglais, mélange
/cars
et/car
n'est pas semantical et donc une mauvaise idée. Toujours utiliser le pluriel quand il y a plus d'un élément dans cette catégorie. - Ce sont de mauvaises réponses. La recherche doit utiliser des chaînes de requête. Les chaînes de requête sont 100% Reposante lorsqu'il est utilisé correctement (c'est à dire, pour la recherche).
- découvrez doriantaylor.com/policy/http-url-path-parameter-syntax
Vous devez vous connecter pour publier un commentaire.
Pour la recherche, l'utilisation querystrings. Ceci est tout à fait Reposante:
Un avantage régulière querystrings, c'est qu'ils sont la norme, et largement compris et qu'ils peuvent être générés à partir de la forme-get.
/cars?color=whatever
.cars?rating=3&operator=%3C%3D
/cars?color=blue&type=sedan&doors=4/engines
ne fonctionne pas/cars/search?param=value
est pour la création d'un recherche (avec ou sans persistance) dont le résultat peut-contient de recherche de notation, la catégorisation, etc. Vous pouvez également créer/supprimer un nom de recherche comme/cars/search/mysearch
. Regardez: stackoverflow.com/a/18933902/1480391search
à apparaître dans le nom de la ressource. Je ne pense pas que ce est ce que la question initiale a été de demander si./cars?filter=this%20should%20be%20filtered
product/id
,product/barcode
? même modèle d'url, mais une valeur différente pour différents colonneLa Reposant URL jolie design est sur l'affichage d'une ressource basée sur une structure (répertoire-comme la structure, la date: les articles/2005/5/13, objet et attributs,..), la barre oblique
/
indique structure hiérarchique, utilisez la-id
à la place.Structure hiérarchique
Je préfère personnellement:
Si un utilisateur supprime le
/car-id
partie, il apporte lacars
preview - intuitive. L'utilisateur sait exactement où dans l'arbre qu'il est, qu'est ce qu'il regarde. Il sait dès le premier regard, que les garages et les voitures sont en relation./car-id
indique aussi qu'il appartient, ensemble, à la différence de/car/id
.Recherche
La searchquery est OK car il est, il y a seulement vos préférences, ce qui devrait être pris en compte. Le plus drôle vient lors de l'adhésion des recherches (voir ci-dessous).
Ou de manière générale tout ce qui n'est pas un slash comme expliqué ci-dessus.
La formule:
/cars[?;]color[=-:]blue[,;+&]
, * bien que je ne voudrais pas utiliser le&
signe qu'il est méconnaissable dans le texte au premier coup d'œil.Listes d'options
fonctionnalités possibles?
Nier les chaînes de recherche (!)
À la recherche d'une quelconque voitures, mais pas noir et rouge:
?color=!black,!red
color:(!black,!red)
Rejoint les recherches
Recherche rouge ou bleu ou noir voitures avec 3 portes de garages id 1..20 ou 101..103 ou 999 mais pas 5
/garage[id=1-20,101-103,999,!5]/cars[color=red,blue,black;doors=3]
Vous pouvez alors construire plus complexes, les requêtes de recherche. (Regardez CSS3 attribut correspondant pour l'idée de sous-chaînes correspondantes. E. g. la recherche des utilisateurs contenant "bar"
user*=bar
.)Conclusion
De toute façon, cela peut être la partie la plus importante pour vous, parce que vous pouvez faire comme bon vous semble, après tout, il suffit de garder à l'esprit que Reposant URI représente une structure qui est facile à comprendre, par exemple, l'annuaire comme
/directory/file
,/collection/node/item
, les dates/articles/{year}/{month}/{day}
.. Et lorsque vous omettez aucun des derniers segments, vous savez immédiatement ce que vous obtenez.Alors.., tous ces personnages sont permis clair:
a-zA-Z0-9_.-~
;/?:@=&$-_.+!*'(),
<>"#%{}|\^~[]`
*Pourquoi dangereux et pourquoi devrait plutôt être codé: RFC 1738 voir 2.2
RFC 3986 voir 2.2
En dépit de ce que j'ai dit précédemment, voici une distinction commune de délimiteurs, ce qui signifie que certains "sont" plus importantes que d'autres.
:/?#[]@
!$&'()*+,;=
Plus de lecture:
Hiérarchie: voir 2.3, voir 1.2.3
chemin d'accès d'url syntaxe de paramètre
CSS3 attribut correspondant
IBM: RESTful Web services - notions de base
Remarque: la RFC 1738 a été mis à jour par la RFC 3986
POST
. Aussi, d'autres idées que vous a donné votre réponse, sont également très appréciable. Merci beaucoup!;
par opposition à&
est la lisibilité? Parce que si oui, je pense que je préfères le&
que c'est le plus commun, séparateur...droit? 🙂 Merci!&
comme un délimiteur est connu que pour les développeurs. Parents, grands-Parents et les personnes non instruites de la population accepte les délimiteurs utilisés en commun d'un texte écrit.index.php?category=garages/cars&garageid[]=20&garageid[]=21&garagerange[]=5-10&carcolor[]=blue&carcolor[]=red
ou nous pourrions avoir/garages[5-10,20,21]/cars[color=red,blue]
..
n'est pas réservé à une requête de la partie et peut être utilisé à la fois de l'onu/codé, par exemple?value=1.4
, mais l'encodage, il allait changer la sémantique de l'url dans le accueil, commesub.example.com
.Bien qu'ayant les paramètres dans le chemin d'accès a certains avantages, il y a, de l'OMI, certains dépassant de facteurs.
Pas tous les caractères nécessaires pour une requête de recherche sont autorisés dans une URL. La plupart des signes de ponctuation et des caractères Unicode doivent être codées dans l'URL comme un paramètre de chaîne de requête. Je suis confronté au même problème. Je voudrais utiliser XPath dans l'URL, mais pas tous de la syntaxe XPath est compatible avec un chemin de l'URI. Donc, pour de simples chemins,
/cars/doors/driver/lock/combination
serait approprié pour localiser la "combination
' élément dans la porte du conducteur document XML. Mais/car/doors[id='driver' and lock/combination='1234']
n'est pas si amical.Il y a une différence entre le filtrage des ressources fondées sur l'un de ses attributs et de la spécification d'une ressource.
Par exemple, depuis
/cars/colors
renvoie une liste de toutes les couleurs pour toutes les voitures (la ressource retournée est une collection d'objets de couleur)/cars/colors/red,blue,green
doit retourner une liste des objets de couleur qui sont le rouge, le bleu ou le vert, n'est pas une collection de voitures.Pour retourner les voitures, le chemin serait
/cars?color=red,blue,green
ou/cars/search?color=red,blue,green
Paramètres dans le chemin d'accès sont plus difficiles à lire parce que les paires nom/valeur ne sont pas isolés du reste de la voie, ce qui n'est pas des paires nom/valeur.
Un dernier commentaire. Je préfère
/garages/yyy/cars
(toujours au pluriel) à/garage/yyy/cars
(c'était peut-être une faute de frappe dans l'original de la réplique), car il évite d'avoir à changer le chemin d'accès entre le singulier et le pluriel. Pour les mots avec un "s", le changement n'est pas si mal, mais en changeant de/person/yyy/friends
à/people/yyy
semble lourd.De s'étendre sur la réponse de Pierre - que vous pourriez faire de la Recherche de première classe de ressources:
La Recherche de ressources aurait champs de couleur, marque, modèle, garaged statut, etc et peut être spécifiée dans le format XML, JSON, ou tout autre format. Comme la Voiture et le Garage de ressources, vous pouvez restreindre l'accès à des Recherches basées sur l'authentification. Les utilisateurs qui souvent le même, les Recherches peuvent les stocker dans leurs profils, de sorte qu'ils n'ont pas besoin d'être re-créé. L'Url sera assez court que dans de nombreux cas, ils peuvent être facilement échangés par e-mail. Ces Recherches stockées peuvent être à la base de la coutume, des flux RSS, et ainsi de suite.
Il existe de nombreuses possibilités pour l'utilisation de Recherches quand vous pensez à eux en tant que ressources.
L'idée est expliquée plus en détail dans ce Railscast.
Justin la réponse est probablement la voie à suivre, bien que dans certaines applications, il serait logique d'envisager une recherche particulière en tant que ressource dans son propre droit, comme si vous voulez soutenir nommé recherches sauvegardées:
ou
Ce n'est pas en RESTE. Vous ne pouvez pas définir les Uri des ressources à l'intérieur de votre API. Ressource de navigation doit être hypertexte à moteur. C'est bien si vous voulez assez d'Uri et de fortes quantités de couplage, mais il suffit de ne pas appeler de REPOS, parce qu'il viole directement les contraintes de l'architecture RESTful.
Voir ce l'article par l'inventeur de REPOS.
J'utilise deux approches pour mettre en œuvre des recherches.
1) le plus Simple des cas, à la requête éléments associés, et pour la navigation.
Cela signifie, requête voitures garage ID égal à 1.
Il est également possible de créer des recherches plus complexes:
Voitures dans tous les garages de la FirstStreet qui ne sont pas rouges (3ème page, 100 éléments par page).
2) requêtes Complexes sont considérés comme de simples ressources qui sont créés et peuvent être récupérés.
Le corps POST pour la recherche la création est comme suit:
Il est basé dans le Graal (critères DSL): http://grails.org/doc/2.4.3/ref/Domain%20Classes/createCriteria.html
Si j'aime Justin réponse, je sens qu'il représente plus précisément un filtre plutôt que d'une recherche. Que faire si je veux savoir sur les voitures avec des noms qui commencent avec la cam?
La façon dont je le vois, vous pourriez construire dans la façon de manipuler les ressources spécifiques:
/autos/cam*
Ou, vous pouvez simplement ajouter dans le filtre:
/autos/portes/4/nom/cam*/couleurs/rouge,bleu,vert
Personnellement, je préfère le dernier, mais je suis pas un expert sur le REPOS (après avoir d'abord entendu parler de lui seulement 2 ou si il y a des semaines...)
/cars?name=cam*
RESTful ne recommandons pas l'utilisation de verbes dans les URL /voitures/la recherche n'est pas de tout repos. La bonne façon de filtre/recherche/paginer votre API est à travers les Paramètres de la Requête. Toutefois, il pourrait y avoir des cas où vous devez sortir de la norme. Par exemple, si vous êtes à la recherche à travers de multiples ressources, alors vous devez utiliser quelque chose comme /search?q=requête
Vous pouvez aller à travers les http://saipraveenblog.wordpress.com/2014/09/29/rest-api-best-practices/ à comprendre les meilleures pratiques pour la conception d'API RESTful de
En outre, je dirais aussi:
Ici,
Search
est considérée comme un enfant de la ressource de laCars
ressource.Il ya beaucoup de bonnes options pour votre cas ici. Encore, vous devriez envisager d'en utiliser le contenu du POST.
La chaîne de requête est parfait pour votre exemple, mais si vous avez quelque chose de plus compliqué, par exemple, l'arbitraire d'un longue liste d'articles ou booléennes instructions conditionnelles, vous pouvez définir le message comme un document, que le client envoie plus de COURRIER.
Cela permet plus de souplesse description de la recherche, ainsi que les évite l'URL du Serveur de limite de longueur.
Mon conseil serait celui-ci:
Edit:
J'espère que ça vous donne l'idée. Essentiellement de votre API Rest doit être facilement détectable et devrait vous permettre de parcourir vos données. Un autre avantage de l'utilisation d'Url et pas de chaînes de requête, c'est que vous êtes en mesure de profiter de la patrie, de la mise en cache des mécanismes qui existent sur le serveur web pour le trafic HTTP.
Voici un lien vers une page décrivant les maux de chaînes de requête en RESTE: http://web.archive.org/web/20070815111413/http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful
J'ai utilisé le cache de Google parce que la normale page ne fonctionnait pas pour moi ici le lien:
http://rest.blueoxen.net/cgi-bin/wiki.pl?QueryStringsConsideredHarmful
/cars/colors/red,blue,green
et/cars/colors/green,blue,red
? L'élément de chemin de l'URI doit être hiérarchique, et je ne vois vraiment pas ce qui est le cas ici. Je pense que c'est une situation où la chaîne de la requête est le choix le plus approprié./cars/colors/red,blue,green
. La dernière partie devrait être une chaîne de requête.