我们正在使用Play Framework构建一个完全RESTful的后端。 我们还在构建一个单独的Web前端,该前端具有不同的技术堆栈,可以调用RESTful API。
我们如何部署这两个应用程序,使它们具有相同的域名,一些url用于后端API,一些用于前端视图?
例如,访问MyDomain.com意味着前端显示主页,但发送GET到MyDomain.com/product/24意味着后端返回带有产品信息的JSON对象。 另一种可能性是,如果Web浏览器查看MyDomain.com/product/24,则前端显示HTML页面,该网页是通过对同一URL的后端调用构建的。
最后,我们需要两个专用服务器吗? 或者可以将前端和后端部署在同一台服务器上(例如OpenShift,Heroku)
毫无疑问,最简单,最干净的方法是创建一个为BE和FE提供数据的应用程序,其中您通过URL,伪路由区分响应(JSON与HTML):
GET /products/:id controllers.Frontend.productHtml(id)
GET /backend/products/:id controllers.Backend.productJson(id)
优点:
如果您真的决心创建一个两个独立的应用程序,请使用一些HTTP服务器作为代理 - 例如nginx
- 因此它会将所有请求发送到domain.tld/*
到在端口9000
工作的应用程序(将使用HTML回答但是对domain.tld/backend/*
请求重定向到使用JSON响应在端口9001
工作的应用程序。
如果您真的要根据调用者使用JSON或HTML进行响应,您可以尝试比较标头以检查请求是从浏览器发送还是从每个控制器中的AJAX调用发送,但请相信我这将成为一个比您更快的噩梦。 ..插入硬币,选择风味
其他可能性(因此作为单独的答案)是使用在Play 2.1.x
添加的一种可能性和Content negotiation
我认为它最接近你想要获得的最初:)
事实上,更容易创建一个MEAN STACK APP并使用像Heroku这样的托管。 你的前端就是这样,后端的前端。 这样很容易访问backend / restfulAPI和前端:
http:// localhost:3000 / api / contacts (访问和使用您的API端点)
http:// localhost:3000 / contacts (frontend)
NB:本地主机:3000或http://yourapp.com/api/contacts (API) http://yourapp.com/contacts (前端)
.....它在网址:)