MVC- und RESTful-API-Service

12

MVC ist ziemlich einfach. Es gibt ein Modell, einen Controller und eine Ansicht. Wenn wir eine Website erstellen, wird alles zusammengeführt, wenn der Client eine REST-Schlüsselwortanforderung an den Server sendet -> der Server die angeforderte URL mit der Controller-Aktion übereinstimmt -> der dann die Modelle zur Datenerfassung / -verarbeitung aufruft und das Ergebnis erhält -> und gibt das Ergebnis als HTML-Seite (Ansicht) an den Client zurück .

Was ist, wenn es sich um einen reinen RESTful API-Webdienst handelt? Dann sendet der Ablauf so etwas wie ' Client sendet eine REST-Schlüsselwortanforderung an den Server -> der Server stimmt die angeforderte URL mit der Controller-Aktion überein -> der dann die Modelle zur Datenerfassung / -verarbeitung aufruft, das Ergebnis erhält -> und zurückgibt das Ergebnis zurück an den Client in JSON '. Wie zuvor, aber es gibt keine "Ansicht" ... oder besser gesagt, der generierte JSON kann als "Ansicht" betrachtet werden. In gewissem Sinne verwenden wir nur den MC-Teil von MVC. Ist es so, wie es gemacht werden soll? Oder gibt es andere, besser geeignete Muster für einen Nur-API-Dienst anstelle von MVC?

Simon
quelle

Antworten:

21

MVC ist ein Paradigma aus der Smalltalk-Welt, das sich mit der Frage befasst, wie objektorientierte Systeme Benutzeroberflächen haben könnten.

Frühe Web-Frameworks nahmen die allgemeine Idee (trennen Geschäftslogik, Steuerlogik und Ansichtslogik) und wandten das Prinzip auf die Strukturierung der Webanwendung an. Vorher war es nicht ungewöhnlich, dass Gott schrecklichen Code von HTML-Generierungscode in Domänenobjekten oder Geschäftslogik in HTML-Vorlagen durcheinander brachte (denken Sie an sehr frühes PHP).

Die Sache ist, dass die ursprüngliche MVC aus der Smalltalk-Welt nicht wirklich das ist, was MVC in den meisten Web-Frameworks ist. Eine HTML-Ausgabe ist nicht wirklich eine "Ansicht" in dem Sinne, wie Smalltalk einen UI-Bildschirm verstanden hat.

Das ist also der erste Grund, sich nicht zu sehr darauf einzulassen, ob Sie MVC richtig folgen. Kaum etwas ist. Nehmen Sie es weniger als strenge Unterteilung als vielmehr als Richtlinie von Hey. Wäre es nicht schön, wenn unsere HTML-Vorlagen nicht voller Geschäftslogik wären?

Zweitens ist MVC nur eine Möglichkeit, serverseitigen Code zu strukturieren. Es hat wirklich nichts mit REST / HTTP zu tun. REST befasst sich mit der Kommunikation zwischen Clients und Servern. Es ist egal, ob sich die Darstellung, die der Server an den Client sendet, in einer HTML-Vorlage befindet, deren Erstellung mit einer Vorlagen-Engine viel Zeit in Anspruch nahm, oder in einem JSON-Objekt, das ein Aufruf im Controller war.

Wenn Sie nicht glauben, dass Ihr Server eine "Ansicht" -Ebene benötigt, ist dies in Ordnung. Sie profitieren weiterhin davon, wenn Sie Ihre Geschäftslogik (dh Ihr Modell) von den Controllern trennen, die eine bestimmte HTTP-Anforderung verarbeiten, selbst wenn alle Controller einen JSON-Parsing-Aufruf für ein Objekt aufrufen und diese Daten zurückgeben.

Cormac Mulhall
quelle
Genau das, was ich hören musste. Ich komme aus der Welt der Webentwickler (entlang der One-File-Skripte), daher habe ich nicht gesehen, wie große Apps außerhalb des Web normalerweise strukturiert sind. Das System, das ich derzeit implementiere, geht weit über eine normale Web-App hinaus. Nach dem, was ich bisher gelesen habe, spielt es keine Rolle, wie Sie die App-Quelle strukturieren. Das Hauptziel besteht darin, die Navigation und Wartung zu vereinfachen. Ich werde Konzepte aus dem MVC-Muster verwenden, um meine App zu strukturieren. Vielen Dank!
Simon
@lime ... das Hauptziel ist es, die Navigation und Wartung zu vereinfachen. Ist das nicht immer das Ziel?
Andy
@ David Packer natürlich ist es =) Ich war einfach zu sehr an ein Konzept gebunden und habe die wirkliche Verwendung dieses Konzepts verpasst .
Simon
1
Schauen Sie sich Bob Martins Präsentation zu Clean Architecture an, wenn Sie eine andere, möglicherweise bessere Methode zum Strukturieren einer Anwendung als viele Web-Frameworks sehen möchten.
Cormac Mulhall
9

Ansicht ist eine Ebene, die für die Anzeige von Informationen verantwortlich ist, die von einem Benutzer / Client Ihrer Anwendung interpretiert werden können (dies bedeutet nicht, dass der Benutzer eine tatsächliche Person sein muss). JSON ist ein vollständig gültiges Format für eine Ansichtsebene. Computer verstehen das.

Solange die Ansichtsebene Informationen veröffentlicht, die von einem Benutzer verwendet werden können, um Modelle in Ihrer Anwendung zu beeinflussen, spielt es keine Rolle, wie die Ansicht aussieht. Es handelt sich dennoch um eine Ansicht, eine Ebene, die als Middleware zwischen dem Benutzer und dem System fungiert .

Andy
quelle
2

MVC ist ziemlich einfach.

Martin Fowler würde dem vielleicht nicht zustimmen :

Verschiedene Leute, die an verschiedenen Orten über MVC lesen, nehmen unterschiedliche Ideen davon und beschreiben diese als "MVC".

Weitermachen ...

Wenn wir eine Website erstellen, wird alles zusammengeführt, wenn der Client eine REST-Schlüsselwortanforderung an den Server sendet -> der Server die angeforderte URL mit der Controller-Aktion übereinstimmt -> der dann die Modelle zur Datenerfassung / -verarbeitung aufruft und das Ergebnis erhält -> und gibt das Ergebnis als HTML-Seite (Ansicht) an den Client zurück.

OK, das ist ein bisschen verwickelt

MVC ist eine Sammlung von Ideen zur Implementierung von Benutzeroberflächen.

REST ist eine Sammlung von architektonischen Einschränkungen für die Erstellung umfangreicher Anwendungen.

Das Web, von dem Sie hier sprechen, ist eine riesige Dokumentenverwaltungsanwendung, die unter Verwendung der meisten dieser Einschränkungen erstellt wurde.

Die Ähnlichkeiten, die Sie zwischen den beiden sehen, werden (treffen Sie Ihre Wahl) falsch zugeschrieben oder oberflächlich.

RESTafarians haben ein gemeinsames Verständnis von HATEOAS , "Hypertext als Motor des Anwendungsstatus", und das sollte Alarme durch Ihren Kopf klingeln lassen - warum sollte eine Ansicht ein Motor des Status sein ? Wenn wir die Prämisse in Frage stellen und nach zusätzlichen Beweisen suchen, können wir auch zwei seltsame Dinge bemerken.

Erstens, dass wir den HTTP-Server vollständig aus der Gleichung entfernen können, indem wir den HTML-Code von der Festplatte laden. Der Browser ist damit vollkommen zufrieden und entschuldigt einige geringfügige Abweichungen im Verhalten, die sich aus der Änderung der Basis-URL ergeben können. Ansichten funktionieren im Allgemeinen nicht weiter, wenn sie vollständig vom Modell und vom Controller getrennt wurden.

Zweitens, wenn wir einen modernen Browser sorgfältig beobachten, werden wir feststellen, dass es mehrere Ansichten des HTML gibt. Mehrere Ansichten einer Ansicht scheinen eine wirklich seltsame Idee zu sein, aber es gibt sicher die Hauptpräsentation mit einer Reihe von Textmarkierungen, die auf Benutzergesten reagieren, und dann gibt es diese "Quellansicht", die den rohen HTML-Code anzeigt und auch darauf reagiert Benutzergesten. Es sind Schildkröten den ganzen Weg nach unten!

Die Antwort auf das Rätsel ist natürlich, dass der HTML-Code nicht die Ansicht ist. Die Sammlung von Widgets im Browser ist die Ansicht und steht in Verbindung mit dem Dokumentobjektmodell , das durch Lesen des HTML-Codes initialisiert wurde.

Mit anderen Worten, der HTML-Code ist eine Repräsentation des Staates, genau wie Roy T. Fielding es versprochen hat.

Was ist, wenn es sich um einen reinen RESTful API-Webdienst handelt? Wie zuvor, aber es gibt keine "Ansicht"

Richtiger wie zuvor: Es gibt keine Sicht. Der JSON ist genau wie der HTML-Code eine Darstellung des Zustands, die zum Überschreiten von Prozessgrenzen geeignet ist.

Denken Sie an "DTO" oder "Nachricht", und Ihre Schlussfolgerungen führen Sie viel seltener in die Irre.

VoiceOfUnreason
quelle
Ich habe Webanfragen mit einem Architekturmuster gemischt, um leichter zu veranschaulichen, was mich am Gesamtkonzept stört. Sie sagen: "Die Sammlung von Widgets im Browser ist die Ansicht" - dann formuliere ich neu: Was ist, wenn es in einer menschlichen Szenerie keinen "Browser" gibt? Was ist, wenn ein anderer Roboter eine Verbindung zum Dienst herstellt? Wenn JSON und HTML die Darstellung des Status sind, ist 'eine Nachricht' oder 'DTO' ein Transport für die Darstellung des Status. Woher kommt dann eine Aussicht? Sie haben mich noch mehr mit Ihrer Antwort verwechselt.
Simon
Das Programm / der Roboter, der / die sich mit dem Dienst verbindet, würde das Modell vermutlich direkt manipulieren - warum sollte es eine Ansicht benötigen?
VoiceOfUnreason
1

Ist es so, wie es gemacht werden soll?

Wenn Sie den JSON als Ansicht übergeben oder als Ansichtsmodell zum Erstellen der Ansicht verwenden, wird das Muster nicht verletzt.

Ich verwende dieselbe Architektur in der aktuellen Anwendung, an der ich arbeite, und sie funktioniert sehr gut. Zusammen mit einem netten JS-Framework können Sie einige wirklich reaktionsschnelle Designs erstellen.

Oder gibt es andere, besser geeignete Muster für einen Nur-API-Dienst anstelle von MVC?

Ehrlich gesagt keine Ahnung. Aber ich denke, dass es nicht so wichtig ist, ob Sie MVC in einer API verwenden oder nicht. Verwenden Sie alles, was Sie für bequem halten. Wenn es um Webdienste geht, müssen viel wichtigere Aspekte berücksichtigt werden (die nicht direkt mit MVC zusammenhängen), z. B. Sicherheit, Konsistenz, Verfügbarkeit usw.

djvuk
quelle