在同一个域上分离后端应用程序和前端应用程序?

时间:2013-07-31 20:31:42

标签: api rest deployment playframework openshift

我们正在使用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)

4 个答案:

答案 0 :(得分:11)

你要挖掘自己......深深地说:)

最简单,最干净的方法毫无疑问是创建一个单独的应用程序,为BE和FE提供数据,您可以通过URL,伪路由区分响应(JSON与HTML):

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

好处:

  • 单一部署(比如Heroku)
  • 从一个应用程序管理的名称空间
  • 更改其中一个应用后,无需修改许多应用中的模型

否则如果

如果您真的决定创建两个单独的应用程序,请使用一些HTTP服务器作为代理 - 例如nginx - 因此它会将所有请求发送到domain.tld/*到端口处的应用程序9000(将使用HTML回答)但domain.tld/backend/*请求重定向到使用JSON响应端口9001的应用程序。

否则

如果您真的要根据调用者使用JSON或HTML进行响应,您可以尝试比较标头以检查请求是从浏览器发送还是从每个控制器中的AJAX调用发送,但请相信我这将成为一个噩梦比你的东西......插入硬币,选择风味

答案 1 :(得分:2)

其他可能性(因此作为单独的答案)使用Play 2.1.x a Content negotiation中添加的可能性我认为它最接近你最初想要获得的内容:)

答案 2 :(得分:1)

我想到了另一种解决方案。我将后端部署到类似

的子域

http://api.myapp.com

并将前端部署到主域:

http://myapp.com/

但是我认为您最好使用2种不同的主机,其中一种用于前端,另一种用于后端(我搜索了google,这是我调查的结果:)

答案 3 :(得分:0)

实际上,创建一个MEAN STACK APP并使用像Heroku这样的托管更容易。 你的前端就是这样,后端的前端。可以轻松访问backend / restfulAPI和前端,如下所示:

http://localhost:3000/api/contacts(访问和使用您的API端点)

http://localhost:3000/contacts(前端)

注意:localhost:3000或http://yourapp.com/api/contacts(api)                       http://yourapp.com/contacts(前端)

.....在网址中:)