Отдельные серверные и интерфейсные приложения в одном домене?

Мы создаем полностью RESTful-сервер с Play Framework. Мы также создаем отдельный веб-интерфейс с другим стеком технологий, который будет вызывать API RESTful.

Как мы развертываем оба приложения, чтобы они имели одно и то же имя домена, с некоторым URL-адресом, используемым для API-интерфейсов, и некоторыми для интерфейсных просмотров?

Например, посещение MyDomain.com означает, что передняя панель отображает домашнюю страницу, но отправка GET на MyDomain.com/product/24 означает, что back-end возвращает объект JSON с информацией о продукте. Еще одна возможность заключается в том, что если веб-браузер просматривает MyDomain.com/product/24, тогда на интерфейсе отображается HTML-страница, и эта веб-страница была построена из внутреннего вызова на тот же URL-адрес.

Наконец, для этого нужны два выделенных сервера? Или можно использовать интерфейсный и серверный серверы на одном сервере (например, OpenShift, Heroku).

Ответ 1

Ты собираешься копать себя... глубоко:)

Самый простой и самый чистый подход без каких-либо сомнений заключается в создании одного приложения, обслуживающего данные как для BE, так и для FE, где вы отличаете ответ (JSON против HTML) по URL-адресу, псевдо маршруты:

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

Преимущества:

  • одно развертывание (скажем, в Героку)
  • пространство имен управляется из одного приложения
  • Не нужно изменять модели во многих приложениях после изменения в одном из них.

else if

Если вы действительно настроены создать два отдельных приложения, используйте некоторый HTTP-сервер в качестве прокси - для примера nginx - поэтому он отправит все запросы domain.tld/* в приложение, работающее в порту 9000 ( который будет отвечать с помощью HTML), но запрашивает domain.tld/backend/* перенаправление на приложение, работающее в порту 9001 с ответом на JSON.

еще

Если вы действительно собираетесь отвечать с помощью JSON или HTML в зависимости от вызывающего, вы можете попытаться сравнить заголовки, чтобы проверить, был ли запрос отправлен из браузера или из вызова AJAX в каждом контроллере, но поверьте мне, что это станет кошмаром быстрее, чем вы вещь... вставьте монету, выберите аромат

Ответ 2

Другая возможность (поэтому в качестве отдельного ответа) использует возможность, добавленную в Play 2.1.x a Content negotiation Я думаю, что это наиболее близко для этого что вы хотели получить изначально:)

Ответ 3

Действительно, гораздо проще создать MEAN STACK APP и использовать один хостинг, например, Heroku. Ваш интерфейс - это то, что есть, передняя часть для вашего бэкэнда. Будет легко получить доступ к backend/restfulAPI и интерфейсу следующим образом:

http://localhost:3000/api/contacts (для доступа и использования конечной точки API)

http://localhost:3000/contacts (frontend)

NB: localhost: 3000 или http://yourapp.com/api/contacts (api)                     http://yourapp.com/contacts (frontend)

..... его в URL:)