web-dev-qa-db-ja.com

同じドメインでバックエンドアプリとフロントエンドアプリを分離しますか?

PlayFrameworkを使用して完全にRESTfulなバックエンドを構築しています。また、RESTfulAPIを呼び出す別のテクノロジースタックを使用して別のWebフロントエンドを構築しています。

両方のアプリを同じドメイン名にデプロイし、一部のURLをバックエンドAPIに使用し、一部のURLをフロントエンドビューに使用するにはどうすればよいですか?

たとえば、MyDomain.comにアクセスすると、フロントエンドにホームページが表示されますが、GETをMyDomain.com/product/24に送信すると、バックエンドが製品情報を含むJSONオブジェクトを返します。さらに、WebブラウザがMyDomain.com/product/24を表示し、フロントエンドにHTMLページが表示され、そのWebページが同じURLへのバックエンド呼び出しから作成された場合も考えられます。

最後に、これには2つの専用サーバーが必要ですか?または、フロントエンドとバックエンドを同じサーバー(OpenShift、Herokuなど)にデプロイできますか?

21
Erich

あなたは自分自身を掘るつもりです...深い:)

間違いなく最も単純で最もクリーンなアプローチは、BEとFEの両方のデータを提供する単一のアプリケーションを作成することです。ここでは、URL、疑似ルートによって応答(JSONとHTML)が異なります。

GET  /products/:id          controllers.Frontend.productHtml(id)
GET  /backend/products/:id  controllers.Backend.productJson(id)

利点:

  • 単一のデプロイメント(Herokuとしましょう)
  • 1つのアプリから管理される名前空間
  • いずれかのアプリを変更した後、多くのアプリのモデルを変更する必要はありません

else if

2つの別々のアプリを作成することに本当に決心している場合は、プロキシとしてHTTPサーバーを使用します(例:nginx)。これにより、すべてのリクエストがdomain.tld/*に送信され、ポート9000で動作するアプリケーションに送信されます( HTML)ただし、domain.tld/backend/*へのリクエストは、JSONで応答するポート9001で動作するアプリケーションにリダイレクトされます。

else

呼び出し元に応じてJSONまたはHTMLで応答する場合は、ヘッダーを比較して、要求がブラウザーから送信されたか、各コントローラーのAJAX呼び出し)から送信されたかを確認できますが、それを信じてくださいあなたよりも早く悪夢になります...コインを挿入し、味を選択してください

13
biesior

他の可能性(したがって別の答えとして)は、Play 2.1.x a Content negotiation で追加された可能性を使用することです。最初に取得したいものに最も近いと思います:)

2
biesior

実際、MEAN STACK APPを作成し、たとえばHerokuのような1つのホスティングを使用する方がはるかに簡単です。フロントエンドはそれが何であるか、バックエンドのフロントエンドです。次のように、バックエンド/ restfulAPIとフロントエンドに簡単にアクセスできます。

http:// localhost:3000/api/contacts (APIエンドポイントにアクセスして使用するため)

http:// localhost:3000/contacts (フロントエンド)

注意:localhost:3000または http://yourapp.com/api/contacts (api) http://yourapp.com/contacts (フロントエンド)

.....それはURLにあります:)

0
dancun chiriga