我们正在使用 Play 框架构建一个完全 RESTful 的后端。我们还使用不同的技术堆栈构建一个单独的 Web 前端,该前端将调用 RESTful API。
我们如何部署这两个应用程序,使它们具有相同的域名,其中一些 URL 用于后端 API,一些 URL 用于前端 View ?
例如,访问MyDomain.example
意味着前端显示主页,但发送GET到MyDomain.example/product/24
意味着后端- end 返回包含产品信息的 JSON 对象。另一种可能性是,如果 Web 浏览器查看 MyDomain.example/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)
好处:
- 单一部署(比如 Heroku)
- 由一个应用管理的命名空间
- 在其中一个应用发生更改后,无需再修改多个应用中的模型
否则如果
如果您确实决定创建两个独立的应用程序,请使用某个 HTTP 服务器作为代理 - 例如 nginx
- 这样它将把所有请求发送到 domain.tld/*
到在端口 9000
工作的应用程序(将使用 HTML 应答),但对 domain.tld/backend/*
的请求重定向到在端口 工作的应用程序>9001
使用 JSON 进行响应。
其他
如果你真的要根据调用者的情况使用 JSON 或 HTML 进行响应,你可以尝试比较 header 来检查请求是从浏览器还是从每个 Controller 中的 AJAX 调用发送的,但相信我,这将成为一场噩梦,比你的东西...插入硬币,选择口味
关于api - 在同一域中分离后端和前端应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980385/