Отдельные серверные и интерфейсные приложения в одном домене?
Мы создаем полностью 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:)