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

时间:2012-01-12 01:21:48

标签: 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;

此代码适用于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。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

你让我好奇所以我去查看代码(点击直接在github中查看相关功能)。而且我同意Play!文档远非完整:),实际上代码会受益于更多的javadoc!

更多测试

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

您应该尝试的一件事是模板绝对符号:@@{…}。大多数情况下,您不需要在代码中反转网址,只需在模板中。这是否正确?

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

如果您从浏览器直接访问“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

@@代码basically uses

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

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

结论

也许一些游戏开发者会介入...但我试着帮助一点,并在此过程中学习:)我会让你进入比较这两个函数的全部细节,但它们有很大的不同提供腹肌的方法。网址...