37

我们正在使用 Play 框架构建一个完全 RESTful 的后端。我们还在构建一个单独的 Web 前端,该前端具有不同的技术堆栈,将调用 RESTful API。

我们如何部署这两个应用程序以使它们具有相同的域名,其中一些 url 用于后端 API,一些用于前端视图?

例如,访问 MyDomain.com 意味着前端显示主页,但发送 GET 到 MyDomain.com/product/24 意味着后端返回一个带有产品信息的 JSON 对象。另一种可能性是,如果 Web 浏览器查看 MyDomain.com/product/24,那么前端会显示一个 HTML 页面,并且该网页是通过对同一 url 的后端调用构建的。

最后,我们需要两台专用服务器吗?或者前端和后端是否可以部署在同一台服务器上(例如OpenShift、Heroku)

4

4 回答 4

25

你要挖掘自己……深:)

毫无疑问,最简单和最干净的方法是创建一个为 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/*重定向到应用程序在9001使用 JSON 响应的端口工作。

别的

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

于 2013-08-01T17:09:30.877 回答
9

我想到了一个不同的解决方案。我要将后端部署到一个子域,例如

http://api.myapp.com

并将前端部署到主域:

http://myapp.com/

但我认为你最好使用 2 个不同的主机,一个用于前端,一个用于后端(我搜索了谷歌,这是我调查的结果 :)

于 2020-11-19T10:45:38.713 回答
2

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

于 2013-08-09T14:58:51.400 回答
1

事实上,创建 MEAN STACK 应用程序并使用像 Heroku 这样的主机要容易得多。你的前端就是这样,你的后端就是前端。像这样访问后端/restfulAPI和前端将很容易:

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

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

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

.....它在网址中:)

于 2017-03-23T20:49:39.920 回答