Подтвердить что ты не робот

Play Framework 2.1: Scala: как получить весь базовый url (включая протокол)?

В настоящее время я могу получить хост от request, который включает в себя домен и дополнительный порт. К сожалению, он не включает протокол (http vs https), поэтому я не могу создать абсолютные URL-адреса для самого сайта.

object Application extends Controller {
  def index = Action { request =>
    Ok(request.host + "/some/path") // Returns "localhost:9000/some/path"
  }
}

Есть ли способ получить протокол от объекта запроса?

4b9b3361

Ответ 1

Фактически ваш номер порта даст вам, если он http или https.

Запустите свой сервер воспроизведения с поддержкой https JAVA_OPTS=-Dhttps.port=9001 play start

Здесь фрагмент кода (вы можете сделать проверку более стабильной с регулярным выражением, взять номер порта https из свойств...)

def path = Action { request =>
    val path = 
      if(request.host.contains(":9000"))
        "http://" + request.host + "/some/path"
      else
        "https://" + request.host + "/some/path"
    Ok(path)
  }

Код вернет

http://ServerIp:9000/some/path if it thru http
https://ServerIp:9001/some/path if it thru https

Ответ 2

На самом деле есть простой способ сделать это, используя класс Call, который использует обратные маршрутизаторы для достижения аналогичной вещи. Учитывая, что вы находитесь в рамках неявного запроса, вы можете сделать что-то вроде этого:

new Call(request.method, input.request).absoluteURL()

и он предоставит вам полный URL-адрес (протокол, хост, маршрут и параметры).

Ответ 4

Я не думаю, что есть.

Обходным путем является использование относительных URL-адресов с помощью //domain.com/path.

Это, однако, не поможет вам со ссылками по электронной почте. В этом случае вы можете поместить протокол в application.conf. В большинстве случаев разница заключается в том, что производство поддерживает https, а разработка - нет.

Мне еще не найти ситуацию, когда вышеупомянутые обходные пути не работают.

Ответ 5

Моим решением было передать начало URL-адреса в качестве дополнительного параметра из javascript. Решение application.conf не работает для меня, потому что одно и то же приложение доступно на http и https, но из разных подсети и домена.