玩!框架:Router.getFullUrl("action")和Router.reverse("action")之间有什么区别.absolute()?

Cyr*_*ôte 5 apache2 playframework

我的Play上需要一个绝对的URL!1.2.4应用程序作为OAuth身份验证的回调(使用Scribe.

我的应用程序在Apache虚拟代理后面运行,可通过带有"http://myapp.mydomain.com"等子域的URL访问,代理"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;
Run Code Online (Sandbox Code Playgroud)

这段代码适用于Play!1.2.3:它返回"http://myapp.mydomain.com/callback".

现在我用Play了!1.2.4,此代码现在返回"http://www.mydomain.com:9000/callback"(由虚拟代理翻译的URL没有子域名),就好像Play!现在使用HTTP请求的URL来构建此绝对URL.

我凭经验将这个代码替换为Router.getFullUrl("Controller.callback"),这解决了我的问题.

这两种方法Router.getFullUrl()Router.absolute()没有记录(booo!),我想知道解决我的问题的微妙差异.我想Router.absolute()使用当前的HTTP请求来构建绝对URL,并Router.getFullUrl()使用application.baseUrl配置属性.我也可能有Apache配置问题(因为它显然不是我的技能之一!),但是ProxyPreserveHost设置为On,我认为我的虚拟代理对Play来说是透明的!应用程序,我不明白为什么它从Play切换时出现!1.2.3至1.2.4.

谢谢你的帮助.

Ste*_*ano 4

你让我很好奇,所以我研究了代码(点击直接在 github 中查看相关函数)。我同意玩!文档还远未完成:),实际上代码会受益于更多的 javadoc!

\n\n

更多测试

\n\n

无论如何,这可能是一个错误......或误用!,您应该做一些测试:

\n\n

您应该尝试的一件事是模板绝对符号:@@{\xe2\x80\xa6}。大多数时候,您不需要在代码中反转 url,只需在模板中即可。这是否正确?

\n\n

你试过了吗Router.reverse("action", true)

\n\n

如果您使用所有不同的“绝对”选项直接从浏览器访问“localhost:9000”网址,会发生什么情况?

\n\n

代码

\n\n

1.2.4代码中:

\n\n

String getFullUrl(...)简单地等于getBaseUrl() + actionDefinition=reverse(...)

\n\n

并且 \nString getBaseUrl()被定义为application.baseUrl仅当没有请求时 - 否则它使用Http.Request.current().getBase().

\n\n

ActionDefinition.absolute使用结果中的一堆变量reverse

\n\n

1.2.3代码中:

\n\n

reverse

\n\n

absolute

\n\n

@@标签基本上使用

\n\n
private String __reverseWithCheck(String action, boolean absolute) {\n    return Router.reverseWithCheck(action, Play.getVirtualFile(action), absolute);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

绝对 true 时,即直接调用reverse(action,absolute=true),但接收的是字符串而不是 ActionDefinition

\n\n

结论

\n\n

也许一些游戏开发人员会介入……但我试图提供一些帮助,并在这个过程中学习:)我会让您了解比较这两个函数的完整细节,但他们在提供腹肌。网址...

\n