Играть!Framework: в чем разница между Router.getFullUrl ("действие") и Router.reverse ("действие"). absolute ()? - PullRequest
5 голосов
/ 12 января 2012

Мне нужен абсолютный URL в моей Play! 1.2.4 приложение в качестве обратного вызова для аутентификации OAuth (с использованием Scribe .

Мое приложение работает за виртуальным прокси-сервером Apache, доступ к которому осуществляется через URL с субдоменом, например "http://myapp.mydomain.com", proxying" http://127.0.0.1:9000". ProxyPreserveHost имеет значение On. В моей игре! В конфигурации приложения у меня есть следующее свойство: application.baseUrl=http://myapp.mydomain.com/.

Чтобы вычислить этот абсолютный URL, я использовал такой фрагмент кода:

Router.ActionDefinition ad = Router.reverse("Controller.callback");
ad.absolute();
return ad.url;

Этот код отлично работал с Play! 1.2.3: возвращено "http://myapp.mydomain.com/callback".

Теперь, когда я использую Play! 1.2.4, этот код теперь возвращает "http://www.mydomain.com:9000/callback" (переведенный URL-адрес виртуальным прокси-сервером без субдомена), как если бы Play! Теперь использовал URL-адрес HTTP-запроса для создания этого абсолютного URL-адреса.

Я эмпирически заменил этот код на Router.getFullUrl("Controller.callback"), что решает мою проблему.

Эти два метода Router.getFullUrl() и Router.absolute() не документированы (буо!), И мне было интересно узнать тонкие различия, чтобы понять мою проблему. Я предполагаю, что Router.absolute() использует текущий HTTP-запрос для создания абсолютного URL, а Router.getFullUrl() использует application.baseUrl свойство конфигурации. У меня также может быть проблема с конфигурацией Apache (поскольку это явно не одно из моих умений!), Но с ProxyPreserveHost, установленным на On, я предположил, что мой виртуальный прокси будет прозрачным для Play! приложение, и я не понимаю, почему он появляется при переходе из Play! 1.2.3 до 1.2.4.

Спасибо за вашу помощь.

1 Ответ

4 голосов
/ 13 января 2012

Вы заинтересовались, поэтому я начал изучать код (нажмите, чтобы увидеть соответствующие функции непосредственно в github).И я согласен, что играть!документация далека от завершения :), на самом деле код может принести пользу еще нескольким javadocs!

Еще несколько тестов

В любом случае, это может быть ошибка ... или неправильное использование!пару тестов, которые вы должны сделать:

Одна вещь, которую вы должны попробовать, это абсолютная запись шаблона: @@{…}.Большую часть времени вам не нужно менять URL в вашем коде, только в шаблонах.Это правильно или нет?

Вы пробовали Router.reverse("action", true)?

И что произойдет, если вы получите прямой доступ к URL "localhost: 9000" из браузера, со всеми различными "абсолютными"варианты?

Код

В коде 1.2.4:

String getFullUrl(...) просто равен getBaseUrl() + actionDefinition=reverse(...)

и String getBaseUrl() определяется как application.baseUrl ТОЛЬКО ЕСЛИ нет запроса - в противном случае он использует Http.Request.current().getBase().

ActionDefinition.absolute использует набор переменныхиз результата reverse.

В 1.2.3 код:

reverse

absolute

Тег @@ в основном использует :

private String __reverseWithCheck(String action, boolean absolute) {
    return Router.reverseWithCheck(action, Play.getVirtualFile(action), absolute);
}

с абсолютным значением true, то есть прямым обратным вызовом (action, absolute = true)но получаю строку, а не ActionDefinition

Выводы

Может быть, кто-нибудь из разработчиков игр вмешается ... но я попытался немного помочь и учиться в процессе :) Я позволювы вступаете в полные детали сравнения двух забавныхно у них совсем другой подход к доставке пресса.URL ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...