Маршрутизация динамического пути в Play для Scala

У меня есть 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одновременно

Вам нужно, чтобы и /test, и /prod работали одновременно, или это просто проблема конфигурации между средами? Если у вас просто разные пути между тестовой и производственной средами, вы можете использовать play.http.context, например, добавив play.http.context = "/test" in your conf / application.conf`. Посмотрите, как использовать разные файлы конфигурации для каждого env здесь: playframework.com/documentation/2.6.x/…

marcospereira 11.03.2018 20:50

Они должны жить одновременно, некоторые пользователи могут использовать prod, а другие могут использовать test одновременно.

ps0604 11.03.2018 21:25

Почему бы не развернуть в разных средах одну для тестирования, а другую - для производства.

Arpit Suthar 12.03.2018 07:08

Потому что тестовая среда не будет использоваться для фактического тестирования системы. Это приложение для бизнес-аналитики, в котором пользователь будет тестировать создаваемые запросы перед их переносом в рабочую среду. С точки зрения системы, как prod, так и test являются производственными. С точки зрения пользователя, prod и test - разные среды.

ps0604 12.03.2018 10:09

Вы могли бы определить это так, верно: GET /:environment/url001 MyClass.myMethod

James 20.03.2018 14:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
635
2

Ответы 2

Вы можете использовать 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

В этом случае я посоветую вам создать два разных взноса.

Вместо того, чтобы иметь набор повторяющихся маршрутов, которые вводили бы много кода копирования / вставки, возможно, лучше иметь логику, основанную на ролях. Предполагая, что установлен какой-то механизм управления сеансом / идентификации пользователя, тогда тестовые пользователи могут иметь тестовые учетные данные, которые при входе в систему будут иметь атрибут роли / сеанса, чтобы указать только тестовые возможности. В идеале у вас должны быть разные выделенные экземпляры, поскольку уже похоже, что они используются для разных целей.

Другие вопросы по теме