477 votes

Reposante conception URL pour rechercher

Je suis à la recherche d'un moyen raisonnable de représenter les recherches comme une bonne Url.

Le programme d'installation: j'ai deux modèles, les Voitures et les Garages, où les Voitures peuvent être dans les Garages. Donc, mon url ressembler à:

/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 à la 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

Si la recherche les paramètres de la partie de la PATHINFO ou QUERYSTRING?

En bref, je suis à la recherche d'un bon guide/tutoriel 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?

488voto

pbreitenbach Points 4542

Effectuer des recherches, utilisez querystrings. Ceci est parfaitement réparateur :

Un avantage à querystrings régulière est qu’elles sont standard et bien comprise et qu’ils peuvent être générés de forme-get.

145voto

Qwerty Points 1165

Le RESTful api 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 une structure hiérarchique, utilisez l'id de la place.

Structure hiérarchique

Personnellement, je préfère:

/garage-id/cars/car-id
/cars/car-id   #for cars not in garage

Si un utilisateur supprime l' /car-id partie, il apporte l' cars preview - intuitive. L'utilisateur sait exactement où dans l'arbre qu'il est, ce qu'il recherche. 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.

La recherche

Le searchquery est bien comme il est, il est seulement votre préférence, ce qui devrait être pris en compte. Le plus drôle vient lors de l'adhésion des recherches (voir ci-dessous).

/cars?color=blue;type=sedan   #most prefered by me
/cars;color-blue+doors-4+type-sedan   #looks good when using car-id
/cars?color=blue&doors=4&type=sedan   #I don't recommend using &*

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 l' & signe qu'il est méconnaissable dans le texte au premier coup d'œil.

** Saviez-vous que le passage d'objet JSON dans URI est Reposante? **

Des listes d'options

/cars?color=black,blue,red;doors=3,5;type=sedan   #most prefered by me
/cars?color:black:blue:red;doors:3:5;type:sedan
/cars?color(black,blue,red);doors(3,5);type(sedan)   #does not look bad at all
/cars?color:(black,blue,red);doors:(3,5);type:sedan   #little difference

les fonctionnalités possibles?

Nier les chaînes de recherche (!)
Pour rechercher toutes les voitures, mais pas en noir et rouge:
?color=!black,!red
color:(!black,!red)

Rejoint les recherches
De recherche, de rouge ou de bleu ou de noir les 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 à 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 ou d'une autre règle n' /articles/{year}/{month}/{day} et par ommiting le dernier segment, vous savez ce que vous obtenez.

Alors.., tous ces caractères sont autorisés clair:

  • sans réserve: a-zA-Z0-9_.-~
  • réservés: ;/?:@=&$-_.+!*'(),
  • dangereux*: <>"#%{}|\^~[] ` <-ça, c'est dangereux aussi ^^

*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, ici, est une commune de la distinction, ce qui signifie que certains délimiteurs", sont " de plus en plus important.

  • générique délimiteurs: :/?#[]@
  • sous-délimiteurs: !$&'()*+,;=

Plus de lecture:
Hiérarchie: voir la section 2.3, voir 1.2.3
chemin d'accès d'url syntaxe de paramètre
CSS3 attribut correspondant
IBM: les services Web RESTful - notions de base
Remarque: la RFC 1738 a été mis à jour par la RFC 3986

38voto

Doug Domeny Points 2691

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 le '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.

    Le retour des voitures, le chemin serait

    /cars?color=red,blue,green ou /cars/search?color=red,blue,green

  • Les paramètres de la trajectoire 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 /person/yyy/friends de /people/yyy semble lourd.

36voto

Rich Apodaca Points 7327

Afin d'étendre la réponse de Pierre - que vous pourriez faire de la Recherche de première classe de ressources:

POST    /searches          # create a new search
GET     /searches          # list all searches (admin)
GET     /searches/{id}     # show the results of a previously-run search
DELETE  /searches/{id}     # delete a search (admin)

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.

11voto

Peter Hilton Points 10580

Réponse de Justin est probablement la voie à suivre, bien que dans certaines applications, il serait judicieux d’envisager une recherche particulière en tant que ressource dans sa propre droite, telle que si vous voulez soutenir nommé recherches enregistrées :

ou

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