【问题标题】:Play! framework : what is the difference between Router.getFullUrl("action") and Router.reverse("action").absolute()?玩!框架:Router.getFullUrl("action") 和 Router.reverse("action").absolute() 有什么区别?
【发布时间】:2012-02-08 09:10:31
【问题描述】:

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

我的应用程序在 Apache 虚拟代理后面运行,可以通过带有子域的 URL 访问,例如“http://myapp.mydomain.com”,代理“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),好像玩!现在使用 HTTP 请求的 URL 来构建这个绝对 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。

感谢您的帮助。

【问题讨论】:

    标签: apache2 playframework


    【解决方案1】:

    你让我很好奇,所以我去看了代码(点击直接在 github 中查看相关函数)。我同意播放!文档远未完成 :),实际上代码将受益于更多 javadocs!

    更多测试

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

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

    你试过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

    结论

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

    【讨论】:

    • 感谢您的帮助。我不能使用模板注释 @@{},因为我确实需要在 Java 服务器代码中构建这个反向 URL:它将作为 OAuth 的 Web 重定向回调提供。您对 getFullUrl() 的调查解释了为什么它系统地使用 getBaseUrl() 工作,无论当前是否存在 HTTP 请求。
    • @CyrilLacôte 我仍然认为“绝对”可能存在错误,但在这方面缺乏文档和代码文档,我只会坚持工作:)
    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2022-11-29
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2015-02-24
    相关资源
    最近更新 更多