Je suis assez sensible au message d'Alex-D sur l'organisation du MVT et compagnie.
Je l'ai vécu professionnellement, je suis même encore en plein dedans, et je me pose la question à chaque projet perso que je développe.
L'approche que j'ai toujours employée est la suivante :
-
on part sur un maximum de pages rendues côté serveur, avec redu conditionnel côté serveur si besoin (page HTML générée quoi)
-
on passe par une phase merdique où le rendu est "templatisé" et mappé sur des données crachées en JSON par le serveur (ça, ça pue vraiment, faut limiter au max cette phase)
-
on finit par du "full-API" avec effectivement un framework côté client type angularJS ou backbone
En règle générale la transition se fait assez doucement. Si le code côté serveur est bien organisé (et c'est ce qu'a l'air de dire Andr0), ça se passe sans perte ni fracas. La couche d'accès aux données est isolée, un manager "businness" contient une bonne partie de la logique client, et soit un contrôleur web, soit une méthode API REST fait appel à ce manager. La quantité de code dupliquée côté serveur est très faible.
Côté client : c'est du "tout neuf" au moment où l'on décide de se brancher sur une API. C'est certes frustrant de jeter aux orties les tags côté serveur (if / else) et d'aller coller ça dans des templates angular (ng-if, …) mais on ne duplique pas, on évolue. Rien de plus normal.
L'énorme avantage dans une plateforme open source, c'est que le mec qui développe une application mobile avec un framework web (cordova, phonegap), dispose d'une bibliothèque de template déjà écrite. Et ça, ça fait gagner un temps monumental pour les développeurs tiers (third-party).
Ensuite pour ton exemple d'URL je suis pas DU TOUT d'accord :\
ton "/page/2" n'a rien à faire selon moi dans une URL d'API de ce type. Il n'y a selon moin aucune raison que la pagination soit la même dans l'API que dans le web. Si j'ai envie de développer une timeline à la Twitter pour lire un sujet du forum, ta pagination va plus être une épine qu'autre chose. Un queryParam qui donne le nombre max d'éléments d'une page voulu (dans la limite du raisonnable pour le serveur, HTTP 400 sinon) me semble beaucoup plus adapté