Separate back-end and front-end apps on same domain?
api, deployment, openshift, playframework, rest
Solution
You are gonna to dig yourself... deep :)
Simplest and most clean approach with no any doubt is creating a single application serving data for both, BE and FE, where you differ response (JSON vs HTML) by the URL, pseudo routes:
GET /products/:id controllers.Frontend.productHtml(id)
GET /backend/products/:id controllers.Backend.productJson(id)
Benefits:
- single deployment (let's say to Heroku)
- name space managed from one app
- No need to modify the models in many apps after change in one of them
else if
If you're really determined to create a two separate apps, use some HTTP server as a proxy - for an example `nginx` - so it will send all requests to `domain.tld/*` to application working at port `9000` (which will answer with HTML) but requests to `domain.tld/backend/*` redirect to application working at port `9001` responding with JSON.
else
If you are really gonna to response with JSON or HTML depending on the caller you can try to compare headers to check if request was sent from browser or from AJAX call in each controller , but believe me that will become a nightmare faster than you thing... insert the coin, choose the flavor
Problem
We are building a fully RESTful back-end with the Play Framework. We are also building a separate web front-end with a different technology stack that will call the RESTful API. How do we deploy both apps so they have the same domain name, with some URLs used for the backend API and some for the front-end views? For example, visiting `MyDomain.example` means the front-end displays the home page, but sending a GET to `MyDomain.example/product/24` means the back-end returns a JSON object with the product information. A further possibility is if a web browser views `MyDomain.example/product/24`, then the front-end displays an HTML page, and that webpage was built from a back-end call to the same URL. Finally, do we need two dedicated servers for this? Or can the front-end and back-end be deployed on the same server (e.g. OpenShift, Heroku)