web-dev-qa-db-fra.com

Service MVC et API RESTful

MVC est assez simple. Il y a un modèle, un contrôleur et une vue. Lorsque nous créons un site Web, tout se présente sous la forme 'le client envoie REST requête de mot clé au serveur -> le serveur correspond à l'URL demandée à l'action du contrôleur -> qui appelle ensuite le modèle (s) pour la collecte/le traitement des données, obtient le résultat -> et renvoie le résultat au client sous forme de page HTML (vue) '.

Et si nous parlons d'un service Web API RESTful pur? Ensuite, le flux doit être quelque chose comme 'le client envoie REST requête de mot clé au serveur -> le serveur fait correspondre l'URL demandée à l'action du contrôleur -> qui appelle ensuite le ou les modèles) pour la collecte/le traitement des données, obtient le résultat -> et renvoie le résultat au client en JSON '. Comme avant, mais il n'y a pas de' vue '... ou plutôt, le JSON généré peut être pensé en tant que "vue". Dans un sens, nous n'utilisons que la partie MC de MVC. Est-ce ainsi que cela devrait être fait? Ou existe-t-il d'autres modèles mieux adaptés pour un service API uniquement au lieu de MVC?

12
simon

MVC est un paradigme du monde Smalltalk qui s'intéresse à la façon dont les systèmes orientés objet peuvent avoir des interfaces utilisateur.

Les premiers frameworks web ont repris l'idée générale (séparer la logique métier, la logique de contrôle et la logique de vue) et ont appliqué le principe à la façon dont ils ont structuré l'application web. Avant cela, il n'était pas rare que Dieu ait un terrible gâchis de code de génération HTML à l'intérieur des objets de domaine, ou de la logique métier à l'intérieur des modèles HTML (pensez très tôt à PHP)

Le fait est que le MVC original du monde Smalltalk n'est pas vraiment ce que MVC est dans la plupart des frameworks web. Une sortie HTML n'est pas vraiment une "vue" dans le sens où Smalltalk comprenait un écran d'interface utilisateur.

C'est donc la première raison de ne pas trop vous demander si vous suivez correctement MVC. Presque rien n'est. Prenez-le moins comme une division stricte et plus comme une directive de Hé, ce ne serait pas bien si nos modèles HTML n'étaient pas pleins de logique métier.

Deuxièmement, MVC n'est qu'un moyen de structurer le code côté serveur. Cela n'a vraiment rien à voir avec REST/HTTP. REST concerne la façon dont les clients et les serveurs communiquent. Peu importe si la représentation que le serveur envoie au client est dans un modèle HTML qui a pris beaucoup de temps à construire avec un moteur de modèle, ou un objet JSON qui était un appel dans le contrôleur.

Si vous ne pensez pas que votre serveur a besoin d'une couche "vue", c'est bien. Vous bénéficierez toujours de la séparation de votre logique métier (c'est-à-dire du modèle) des contrôleurs qui gèrent une demande HTTP spécifique, même si tout le contrôleur appelle un appel d'analyse JSON sur un objet et renvoie ces données.

21
Cormac Mulhall

View est une couche chargée d'afficher des informations qui peuvent être interprétées par un utilisateur/client de votre application (cela ne dit pas que l'utilisateur doit être une personne réelle). JSON est un format complètement valide pour une couche de vue, les ordinateurs le comprennent.

Tant que la couche de vue publie des informations qui peuvent être utilisées par un utilisateur pour affecter des modèles dans votre application, peu importe à quoi ressemble la vue, c'est toujours une vue, une couche agissant comme un middleware entre l'utilisateur et le système .

9
Andy

MVC est assez simple.

Martin Fowler serait peut-être en désaccord avec cela :

Différentes personnes lisant sur MVC à différents endroits en tirent des idées différentes et les décrivent comme "MVC".

Continuons ...

Lorsque nous créons un site Web, tout se rassemble lorsque le client envoie REST demande de mot clé au serveur -> le serveur fait correspondre l'URL demandée à l'action du contrôleur -> qui appelle ensuite le ou les modèles) pour la collecte/le traitement des données, obtient le résultat -> et renvoie le résultat au client sous forme de page HTML (vue) '.

OK, c'est un peu un enchevêtrement

MVC, quel qu'il soit, est une collection d'idées pour implémenter des interfaces utilisateur.

REST est un ensemble de contraintes architecturales pour la construction d'applications à grande échelle.

Le Web, dont vous parlez ici, est une application de gestion de documents géante construite en utilisant la plupart de ces mêmes contraintes.

Les similitudes que vous voyez entre les deux sont (faites votre choix) incorrectement attribuées ou superficielles.

RESTafarians ont une compréhension commune de HATEOAS , "l'hypertexte comme moteur de l'état de l'application", et qui devrait envoyer des alarmes sonnant à travers vous head - pourquoi une vue serait-elle un moteur de état ? Si nous remettons en question la prémisse et recherchons des preuves supplémentaires, nous pouvons également remarquer deux choses étranges.

Tout d'abord, nous pouvons retirer complètement le serveur HTTP de l'équation en chargeant le HTML à partir du disque. Le navigateur est parfaitement satisfait de cela, excusant certaines variations mineures de comportement pouvant résulter du changement d'URL de base. Les vues ne continuent généralement pas de fonctionner lorsqu'elles sont complètement déconnectées du modèle et du contrôleur.

Deuxièmement, si nous observons attentivement un navigateur moderne, nous remarquerons qu'il existe plusieurs vues du HTML. Plusieurs vues d'une vue semblent être une idée vraiment étrange, mais bien sûr, il y a la présentation principale, avec un tas de balisage de texte qui répond aux gestes de l'utilisateur, et puis il y a cette chose "Vue source" qui montre le HTML brut et répond également à gestes de l'utilisateur. C'est des tortues tout le long!

La réponse à l'énigme, bien sûr, est que le HTML n'est pas la vue. La collection de widgets dans le navigateur est la vue, et ils sont en communication avec le modèle d'objet de document , qui a été initialisé en lisant le HTML.

En d'autres termes, le HTML est une représentation de l'état, tout comme Roy T. Fielding promis.

Et si nous parlons d'un service Web API RESTful pur ...? Comme avant, mais il n'y a pas de "vue"

Plus correctement, comme avant: il n'y a pas de vue. Le JSON, tout comme le HTML, est une représentation de l'état, appropriée pour franchir les frontières du processus.

Pensez "DTO" ou "Message" et vos inférences seront beaucoup moins susceptibles de vous induire en erreur.

2
VoiceOfUnreason

Est-ce ainsi que cela devrait être fait?

Passer le JSON en tant que vue ou l'utiliser comme modèle de vue pour construire la vue ne viole pas le modèle.

J'utilise la même architecture dans l'application actuelle sur laquelle je travaille et cela fonctionne très bien. Avec un cadre Nice JS, vous pouvez créer des conceptions vraiment réactives.

Ou existe-t-il d'autres modèles mieux adaptés pour un service uniquement API au lieu de MVC?

Honnêtement, aucune idée. Mais je pense que si vous utilisez MVC ou non dans une API n'est pas si important. Utilisez tout ce qui vous convient. Lorsque l'on parle de services Web, il y a des aspects beaucoup plus importants à considérer (qui ne sont pas directement liés à MVC), par exemple sécurité, cohérence, disponibilité, etc.

1
djvuk