Service MVC et API RESTful

12

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 rassemble lorsque le client envoie une demande de mot clé REST au serveur -> le serveur correspond à l'URL demandée pour 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 (affichage) '.

Et si nous parlons d'un service Web API RESTful pur? Ensuite, le flux avec quelque chose comme `` le client envoie une requête de mot clé REST au serveur -> le serveur correspond à 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 est renvoyé au client en JSON '. Comme auparavant, mais il n'y a pas de «vue» ... ou plutôt, le JSON généré peut être considéré comme une «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 uniquement API au lieu de MVC?

Simon
la source

Réponses:

21

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 pris 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 Hey, 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 s'intéresse à la façon dont les clients et les serveurs communiquent. Peu importe si la représentation que le serveur envoie au client se trouve 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.

Cormac Mulhall
la source
Exactement ce que j'avais besoin d'entendre. Je viens du monde des développeurs Web (le long des scripts à un fichier), donc je n'ai pas vu comment les applications à grande échelle non Web sont généralement structurées. Le système que j'implémente va bien au-delà d'une application Web classique. Donc, d'après ce que j'ai lu jusqu'à présent, peu importe la façon dont vous structurez la source de l'application, l'objectif principal est de faciliter la navigation et la maintenance. J'utiliserai des concepts du modèle MVC pour structurer mon application. Merci!
Simon
@lime ... l'objectif principal est de faciliter la navigation et la maintenance. N'est-ce pas toujours le but?
Andy
@David Packer, bien sûr, c'est =) J'étais juste trop enfermé sur un concept, manquant l' utilisation réelle de ce concept.
Simon
1
Consultez la présentation de Bob Martin sur l'architecture propre si vous souhaitez voir une façon différente et potentiellement meilleure de structurer une application que la façon dont de nombreux frameworks Web le font.
Cormac Mulhall du
9

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 .

Andy
la source
2

MVC est assez simple.

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

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 une requête de mot clé REST au serveur -> le serveur correspond à l'URL demandée pour 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 (affichage) '.

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.

Les RESTafariens ont une compréhension commune de HATEOAS , "l'hypertexte comme moteur de l'état de l'application", et cela devrait envoyer des alarmes qui résonnent dans votre tête - pourquoi une vue serait-elle un moteur de l' é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 l' avait 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.

VoiceOfUnreason
la source
J'ai mélangé des demandes Web avec un modèle architectural pour illustrer plus facilement ce qui me dérange dans le concept dans son ensemble. Vous dites: "La collection de widgets dans le navigateur est la vue" - alors je reformule: et s'il n'y a pas de "navigateur" dans un parfum humain? Et si c'est un autre robot qui se connecte au service? Si JSON et HTML sont la représentation de l'état, alors 'un message' ou 'DTO' est un transport pour la représentation de l'état. Alors, où «une vue» se met-elle en place? Vous m'avez encore plus confondu avec votre réponse.
Simon
Le programme / robot se connectant au service manipulerait vraisemblablement le modèle directement - pourquoi aurait-il besoin d'une vue?
VoiceOfUnreason
1

Est-ce ainsi que cela devrait être fait?

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

J'utilise la même architecture dans l'application actuelle sur laquelle je travaille et cela fonctionne très bien. Avec un joli cadre 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 la sécurité, la cohérence, la disponibilité, etc.

djvuk
la source