У меня есть 300 записей, определенных в файле routes, например:
GET /url001 MyClass.myMethod
Это работает с URL-адресами, такими как http://localhost:9000/url001.
Теперь мне нужно определить две среды для этих 300 ссылок: для производства и тестирования. Ссылки будут такими:
http://localhost:9000/prod/url001
для производства (см. prod в пути)
а также
http://localhost:9000/test/url001
для тестирования (см. test в пути).
Я хочу иметь единый набор ссылок в routes, как это можно сделать в Play? Я знаю, что могу определить переменную в пути, например path/:var, но мне нужно установить относительный URL-адрес.
Примечание: Некоторые пользователи могут использовать prod, в то время как другие могут использовать testодновременно
Они должны жить одновременно, некоторые пользователи могут использовать prod, а другие могут использовать test одновременно.
Почему бы не развернуть в разных средах одну для тестирования, а другую - для производства.
Потому что тестовая среда не будет использоваться для фактического тестирования системы. Это приложение для бизнес-аналитики, в котором пользователь будет тестировать создаваемые запросы перед их переносом в рабочую среду. С точки зрения системы, как prod, так и test являются производственными. С точки зрения пользователя, prod и test - разные среды.
Вы могли бы определить это так, верно: GET /:environment/url001 MyClass.myMethod





Вы можете использовать SIRD (String Interpolating Routing DSL): https://www.playframework.com/documentation/2.6.x/ScalaSirdRouter#Binding-sird-Router
Вам нужно будет описать эти 30 записей в источнике scala, затем сделать две записи в маршрутах и привязать их к своему настраиваемому маршрутизатору scala.
Пользовательский роутер будет выглядеть так:
package my.app
import javax.inject.Inject
import play.api.mvc._
import play.api.routing.Router.Routes
import play.api.routing.SimpleRouter
import play.api.routing.sird._
class MainRouter @Inject()(controller: ApiController)
extends SimpleRouter
{
override def routes: Routes = {
case GET(p"/url001") => MyClass.myMethod001
case GET(p"/url002") => MyClass.myMethod002
}
}
conf/routes будет выглядеть так:
/prod my.app.MainRouter
/test my.app.MainRouter
Тем не менее, вам нужно как-то понимать, что кроется внутри приложения, я не знаю, в чем ваша идея - сеанс (файлы cookie) или токены или ...
Because the test environment will not be used to actually test the system. It's for a business intelligence application where the user will test the queries they build before migrating them to production. From the system perspective, both prod and test are production. From the user perspective, prod and test are different environments
В этом случае я посоветую вам создать два разных взноса.
Вместо того, чтобы иметь набор повторяющихся маршрутов, которые вводили бы много кода копирования / вставки, возможно, лучше иметь логику, основанную на ролях. Предполагая, что установлен какой-то механизм управления сеансом / идентификации пользователя, тогда тестовые пользователи могут иметь тестовые учетные данные, которые при входе в систему будут иметь атрибут роли / сеанса, чтобы указать только тестовые возможности. В идеале у вас должны быть разные выделенные экземпляры, поскольку уже похоже, что они используются для разных целей.
Вам нужно, чтобы и
/test, и/prodработали одновременно, или это просто проблема конфигурации между средами? Если у вас просто разные пути между тестовой и производственной средами, вы можете использоватьplay.http.context, например, добавивplay.http.context = "/test" in yourconf / application.conf`. Посмотрите, как использовать разные файлы конфигурации для каждого env здесь: playframework.com/documentation/2.6.x/…