MVCおよびRESTful APIサービス


12

MVCは非常に単純です。モデル、コントローラー、ビューがあります。Webサイトを作成すると、クライアントがRESTキーワード要求をサーバーに送信するときにすべてがまとめられます->サーバーは要求されたURLをコントローラーアクションに一致させます->データ収集/処理のためにモデルを呼び出し、結果を取得します->そして、結果をHTMLページ(ビュー)としてクライアントに返します

純粋なRESTful API Webサービスについて話している場合はどうなりますか?次に、クライアントはRESTキーワード要求をサーバーに送信します->サーバーは要求されたURLをコントローラーアクションに照合します->データ収集/処理のためにモデルを呼び出し、結果を取得して->戻ります結果をJSONでクライアントに返します。以前と同じですが、「ビュー」はありません...むしろ、生成されたJSONは「ビュー」と考えることができます。ある意味では、MVCのMC部分のみを使用しています。それはどのように行われるべきですか?または、MVCの代わりにAPIのみのサービスに適した他のパターンはありますか?

回答:


21

MVCは、オブジェクト指向システムがどのようにUIを持つことができるかを懸念するSmalltalkの世界のパラダイムです。

初期のWebフレームワークは、一般的なアイデア(ビジネスロジック、制御ロジック、ビューロジックを分離する)を採用し、Webアプリケーションの構造に原則を適用していました。これ以前は、ドメインオブジェクト内にHTML生成コードのひどい混乱があったり、HTMLテンプレート内にビジネスロジックがあることは珍しくありませんでした(ごく初期のPHPを考えてください)。

問題は、Smalltalkの世界の元のMVCは、ほとんどのWebフレームワークのMVCとは実際には同じではないということです。HTML出力は、SmalltalkがUI画面であると理解したという意味で、実際の「ビュー」ではありません。

それが、MVCを適切にフォローしているかどうかに夢中にならないための最初の理由です。ほとんど何もありません。厳密な分割ではなく、HTMLテンプレートにビジネスロジックが満載されていないのであればHeyのガイドラインを参考にしてください

第二に、MVCはサーバー側のコードを構造化する方法の1つにすぎません。REST / HTTPとはまったく関係ありません。RESTは、クライアントとサーバーの通信方法に関係しています。サーバーがクライアントに送信する表現が、テンプレートエンジンで構築するのに多くの時間を要したHTMLテンプレートであるか、コントローラーで1回の呼び出しであったJSONオブジェクトであるかは関係ありません。

サーバーに「ビュー」レイヤーが必要だと思わない場合は、問題ありません。すべてのコントローラーが特定のオブジェクトでJSON解析呼び出しを呼び出してそのデータを返す場合でも、特定のHTTP要求を処理しているコントローラーからビジネスロジック(モデル)を分離することでメリットが得られます。


まさに私が聞く必要があったもの。私は(1ファイルスクリプトに沿って)Web開発の世界から来ているので、Web以外の大規模なアプリケーションが通常どのように構造化されているかは知りません。現在実装しているシステムは、通常のWebアプリをはるかに超えています。したがって、これまで読んだことから、アプリのソースをどのように構成するかは重要ではありません。主な目標は、ナビゲートと保守を簡単にすることです。MVCパターンの概念を使用してアプリを構成します。ありがとう!
サイモン

@lime ...主な目標は、ナビゲートと保守を容易にすることです。それは常に目標ではありませんか?
アンディ

@David Packerはもちろんです=)コンセプトに縛られすぎて、そのコンセプトの実際の使用を見逃してしまいました。
サイモン

1
多くのWebフレームワークとは異なる、潜在的に優れた方法でアプリケーションを構成する方法については、クリーンアーキテクチャに関するボブマーティンのプレゼンテーションをご覧ください。
Cormac Mulhall

9

ビューは、アプリケーションのユーザー/クライアントによって解釈される可能性のある情報の表示を担当するレイヤーです(ユーザーが実際の人物である必要はありません)。JSONはビューレイヤーに完全に有効な形式です。コンピューターはそれを理解しています。

ユーザーがアプリケーションのモデルに影響を与えるために使用できる情報をビューレイヤーが公開している限り、ビューがどのように表示されるかは問題ではなく、ビューであり、ユーザーとシステム間のミドルウェアとして機能するレイヤーです。 。


2

MVCは非常に単純です。

マーティン・ファウラーはおそらくこれ同意しないでしょう:

さまざまな場所でMVCについて読んでいるさまざまな人々は、そこからさまざまなアイデアを取り入れ、これらを「MVC」と表現しています。

次へ...

Webサイトを作成すると、「クライアントがRESTキーワード要求をサーバーに送信する->サーバーが要求されたURLをコントローラーアクションに一致させる->データ収集/処理のためにモデルを呼び出して結果を取得するため、すべてがまとめられます。 ->そして、結果をHTMLページ(ビュー)としてクライアントに返します。

わかりました、これは少し複雑です

MVCは、それが何であれ、ユーザーインターフェイスを実装するためのアイデアのコレクションです。

RESTは、大規模なアプリケーションを構築するためのアーキテクチャ上の制約のコレクションです。

ここで話しているのは、同じ制約のほとんどを使用して構築された巨大なドキュメント管理アプリケーションです。

2つの間で見られる類似性は、(あなたが選んだ方がいい)誤った属性であるか、表面的なものです。

RESTafarianHATEOASを一般的に理解しており、「アプリケーション状態のエンジンとしてのハイパーテキスト」であり、頭の中でアラームが鳴るはずです。なぜビュー状態のエンジンになるのでしょうか。前提に疑問を投げかけ、追加の証拠を探す場合、2つの奇妙なことに気づくかもしれません。

まず、ディスクからHTMLをロードすることにより、HTTPサーバーを完全に排除することができます。ブラウザはこれに完全に満足しており、ベースURLの変更から生じる可能性のある動作のいくつかのマイナーなバリエーションを許します。ビューは、通常、そのようにモデルとコントローラーから完全に切断されていると機能しません。

次に、最新のブラウザを注意深く観察すると、HTMLのビューが複数あることに気づくでしょう。ビューの複数のビューは本当に奇妙なアイデアのように見えますが、ユーザーのジェスチャーに応答する一連のテキストマークアップを含むメインプレゼンテーションがあり、生のHTMLを表示し、応答するこの「ソースビュー」があることは確かです。ユーザーのジェスチャー。カメはずっと下にいます!

もちろん、なぞなぞに対する答えは、HTMLはビューではないということです。ブラウザ内のウィジェットのコレクションはビューであり、HTMLを読み取ることによって初期化されたDocument Object Modelと通信します。

言い換えれば、HTMLは、ロイT.フィールディングが約束したように、状態の表現です。

純粋なRESTful API Webサービスについて話している場合はどうなりますか?以前と同じですが、「ビュー」はありません

より正確には、以前と同じ:ビューはありません。JSONは、HTMLと同様に、状態の表現であり、プロセスの境界を越えるのに適しています。

「DTO」または「メッセージ」を考えてください。そうすれば、誤解を招く可能性がはるかに低くなります。


Webリクエストとアーキテクチャパターンを組み合わせて、全体としてコンセプトの中で私が気になっていることをより簡単に説明しました。「ブラウザのウィジェットのコレクションはビューです」と言っているのですが、言い換えると、人間の感覚に「ブラウザ」がない場合はどうでしょうか。サービスに接続している別のロボットの場合はどうなりますか?JSONとHTMLが状態の表現である場合、「メッセージ」または「DTO」は状態表現のトランスポートです。では、「ビュー」はどこにあるのでしょうか。あなたはあなたの答えで私をさらに混乱させました。
サイモン

サービスに接続するプログラム/ロボットは、おそらくモデルを直接操作するでしょう-なぜそれはビューを必要とするのでしょうか?
VoiceOfUnreason 2016

1

それはどのように行われるべきですか?

JSONをビューとして渡す、またはビューモデルとして使用してビューを構築しても、パターンに違反しません。

私が取り組んでいる現在のアプリケーションでも同じアーキテクチャを使用していますが、非常に優れています。素敵なJSフレームワークと組み合わせることで、本当にレスポンシブなデザインを作成できます。

または、MVCの代わりにAPIのみのサービスに適した他のパターンはありますか?

正直、わからない。しかし、APIでMVCを使用するかどうかはそれほど重要ではないと思います。便利なものは何でも使用してください。Webサービスについて話すとき、考慮すべき多くの重要な側面(MVCに直接関係しない)があります。たとえば、セキュリティ、一貫性、可用性などです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.