2010-02-05 2 views
1

Je ne peux pas me sentir à l'aise avec la définition des URI 'good REST'. Le scénario est un site existant avec des produits à vendre. Vous pouvez afficher les données dans un certain nombre de vues, en explorant une hiérarchie, mais en principe cat1/cat/ products ou cat 2/cat3/products ou toute combinaison de catégories 1 à 4. La vue d'autres produits est basée sur une recherche.Définition de l'URI REST

Comment formez-vous les URI?

products/?????? 

Répondre

0

Oui - Le problème ici est que vous ne disposez pas d'un identifiant unique pour la ressource parce que:

products/cat1/cat4 

est en fait la même page que

products/cat4/cat1 

(On peut supposer une vue de tout ce qui est étiqueté avec cat1 et cat4, ou tous les résultats de cat1 et cat4)

Si vos catégories où org Dans une hiérarchie, vous savez que "cat6" est un enfant de "cat1", par exemple.

donc vos deux options seraient

1) Imposer un ordre naturel pour les catégories

ou

2) Avoir deux pointant est essentiellement URI différent de la même ressource (avec une redirection 301 permanant à votre ressource préférée).

+0

merci Sohnee, dans ce cas, le chat haut est la langue, le second peut changer, et ainsi de suite, par exemple, ../ Français/Indépendant/Primaire ou/Allemand/Apprentissage assisté/adulte, mais un autre moyen pourrait être allemand/adulte. La structure de l'uri est-elle requise trop dynamique? Pour moi, c'était un peu comme une recherche, mais avec 4 termes sans hiérarchie - ce qui ne semble pas convenir. – Craig

+0

Je ne pense pas que ce soit trop dynamique. Je pense que vous avez le problème inverse de ce qui serait définitivement non-non. c'est-à-dire si vous aviez un URI et deux ressources - cela ne pourrait pas fonctionner - mais deux URI pointant sur des ressources similaires ne sont pas un anti-pattern. – Fenton

+1

Il ne doit y avoir qu'un seul URI qui renvoie 200 OK avec la représentation. L'autre URI peut renvoyer un 302 Voir Autre. –

1

Vous pouvez utiliser utiliser une chaîne de requête dans votre URI:

/products?categories=german,adult,foo,bar 

Afin d'éviter plusieurs URIs, vous pouvez appliquer une logique comme ordre alphabétique des catégories sur le côté du serveur une requête à l'URI ci-dessus serait redirigez fait par l'intermédiaire d'une 301 Déplacé en permanence réponse à:

/products?categories=adult,bar,foo,german 

pour ce motif partiel de requête ci-dessus pour travailler dans les navigateurs, vous devez utiliser JavaScript pour générer la requête de toute forme de HTML - vous pouvez, alternativement, faire comme si vous vouliez éviter chapeau problème particulier:

/products?cat1=adult&cat2=bar&cat3=foo&cat4=german 
+0

Mike, c'est mon approche naturelle. Il ASLO convient pour les recherches aussi produits? CAT1 = adultes & cat2 = bar & cat3 = foo & cat4 = allemand produits? Cat2 = bar & cat3 = foo & cat4 = allemand produits? Recherche = Livres en allemand Je sais que cela me donne les paramètres pour trouver la liste des produits à retourner. Je suis d'accord avec ça, mais il me manque quelque chose de l'URL plus hiérarchique samples/products/cat1/{cat1}/... – Craig

+0

Peu importe - tant qu'il y a un URI, vous pouvez lier – Mike

+0

Cette idée de rediriger les URI vers des alternatives avec des «meilleures» chaînes de requête me semble redondante. Côté serveur, vous lisiez cette collection de 'catégories' et vous pouvez simplement mettre en cache la recherche. Bien sûr, avec certains JS côté client, c'est assez trivial pour aider en faisant aussi le même ordre pour la requête. – thecoshman

1

Après avoir conçu un site qui suit les principes de l'architecture REST, mon conseil est de baser votre décision sur la structure URI uniquement sur la conception de votre serveur, qui est la façon dont votre serveur va analyser un appel entrant URI et livrer la ressource correspondante. Un principe de conception REST (tel que je le vois) est que vos utilisateurs/clients n'auront JAMAIS besoin de former une URL pour trouver une ressource, ils liront plutôt de l'hypertexte (ie HTML) qui décrit les ressources, identifie ce qu'ils voulez, et obtenez le lien approprié à partir de l'hypertexte (par exemple, en HTML, l'attribut href de la balise contient l'URL, qui pourrait tout aussi bien être une chaîne aléatoire de caractères.)

Encore une fois, à mon avis, si votre application nécessite qu'un utilisateur/client soit capable d'effectuer des recherches pour des catégories arbitrairement nommées, il n'est probablement pas approprié d'avoir une interface RESTfully design

+1

Tant que les règles sont bien définies dans la définition du type de média, il est possible d'effectuer une construction d'uri, par exemple avec un modèle d'URI. –