340 votes

Pagination dans une application web de repos

C'est plus générique de la reformulation de cette question (avec l'élimination des Rails spécifiques pièces)

Je ne suis pas sûr de la façon de mettre en œuvre la pagination sur une ressource dans un cadre Reposant de l'application web. En supposant que j'ai une ressource appelée products, que pensez-vous est la meilleure approche, et pourquoi:

1. En utilisant seulement les chaînes de requête

par exemple. http://application/products?page=2&sort_by=date&sort_how=asc
Le problème ici est que je ne peux pas l'utilisation complète de la page mise en cache et aussi l'URL n'est pas très propre et facile à retenir.

2. À l'aide de pages que les ressources et les chaînes de requête pour le tri

par exemple. http://application/products/page/2?sort_by=date&sort_how=asc
Dans ce cas, le problème est de voir qu' http://application/products/pages/1 n'est pas une ressource unique, puisque l'utilisation des sort_by=price peut donner un résultat tout à fait différent et je ne peux toujours pas utiliser le cache de page.

3. À l'aide de pages de ressources et une URL segment par tri

par exemple. http://application/products/by-date/page/2
Personnellement, je ne vois pas de problème dans l'utilisation de cette méthode, mais quelqu'un m'a prévenu que ce n'est pas la bonne voie à suivre (il n'a pas donner une raison, donc si vous savez pourquoi il n'est pas recommandé, s'il vous plaît laissez-moi savoir)

Toutes les suggestions, les opinions, les critiques sont plus que bienvenus. Merci.

112voto

slf Points 15327

Je suis d’accord avec Finn, mais je vais aller un peu plus loin et dire que pour moi la Page n’est pas une ressource, c’est une propriété de la demande. Qui me fait choisir option 1 chaîne de requête uniquement. Il se sent juste bien. J’aime vraiment comment l' API Twitter est structuré rassasié. Pas trop simple, pas trop compliqué et bien documentée. Pour le meilleur ou le pire, c’est mon dessin « aller à » quand je suis sur le garde de faire quelque chose un sens par rapport à un autre.

69voto

Fionn Points 3708

Je pense que le problème avec la version 3 est plus un "point de vue" le problème, voyez - vous la page de la ressource ou les produits sur la page.

Si vous voyez la page de la ressource, il est parfaitement bien la solution, puisque la requête pour la page 2 sera toujours céder à la page 2.

Mais si vous voyez le produit sur la page de la ressource que vous avez le problème que les produits sur la page 2 peut changer (les anciens produits supprimés, ou quoi que ce soit), dans ce cas, l'URI n'est pas toujours de retour de la même ressource(s).

E. g. Une clientèle de magasins un lien vers la liste de produit page X, la prochaine fois, le lien est ouvert, le produit en question pourrait ne plus être à la page X.

38voto

temoto Points 1323

HTTP a une grande Gamme d'en-tête qui est approprié pour la pagination. Vous pouvez envoyer

Range: pages=1

pour avoir seulement la première page. Qui peut vous forcer à repenser ce qu'est une page. Peut-être que le client veut une autre gamme d'articles. La gamme d'en-tête travaille aussi pour déclarer une commande:

Range: products-by-date=2009_03_27-

pour obtenir tous les produits plus récents que la date ou

Range: products-by-date=0-2009_11_30

pour obtenir tous les produits de plus de cette date. '0' n'est probablement pas la meilleure solution, mais RFC semble vouloir quelque chose pour le début de la plage. Il peut y avoir HTTP analyseurs déployé qui ne serait pas analyser unités=-range_end.

Si les en-têtes n'est pas un (acceptable), je pense que la première solution (tous dans la chaîne de requête) est un moyen de traiter avec les pages. Mais s'il vous plaît, de normaliser les chaînes de requête (sort (key=value) paires dans l'ordre de l'alphabet). Cela résout "?a=1 et b=x" et "?b=x et a=1" différenciation problème.

26voto

Rich Apodaca Points 7327

L'Option 1 me semble la meilleure, dans la mesure où votre application en vue de la pagination comme une technique de production d'un point de vue différent de la même ressource.

Cela dit, le schéma d'URL est relativement insignifiante. Si vous êtes à la conception de votre application pour être hypertexte-driven (comme tout le RESTE, les demandes doivent être par définition), votre client ne sera pas construire n'importe quel Uri sur son propre. Au lieu de cela, votre demande sera de donner les liens vers le client, et le client sera de les suivre.

Une sorte de lien, votre client peut fournir un lien de pagination.

-Un effet secondaire agréable de tout cela, c'est que même si vous changez d'avis sur la pagination de l'URI de la structure et de mettre en œuvre quelque chose de totalement différent de la semaine prochaine, vos clients peuvent continuer à travailler sans aucune modification que ce soit.

12voto

John Snyders Points 91

J'ai toujours utilisé le style de l'option 1. La mise en cache n'a pas été une préoccupation puisque les données changent fréquemment de toute façon dans mon cas. Si vous autorisez la configuration de la taille de la page, les données ne peuvent pas être mises en cache.

Je ne trouve pas l'url difficile à retenir ou impur. Pour moi, c'est une bonne utilisation des paramètres de requête. La ressource est clairement une liste de produits et les paramètres de requête indiquent simplement comment vous voulez afficher la liste - triée et quelle page.

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