【问题标题】:Recursive URL routing in RestletRestlet 中的递归 URL 路由
【发布时间】:2016-01-22 05:51:18
【问题描述】:

我正在使用 Spring 来设置 Restlet 应用程序,并且我有一点需要 URL 是递归的。即,

/something/filter/x/y/filter/a/b/foo

模式大约是:

/something(/filter/{p}/{q})*/foo

因此,URL 中可以有无限数量的过滤器片段。

在 Spring XML 中它看起来像这样:

<bean id="router" class="org.restlet.ext.spring.SpringRouter">
    <constructor-arg ref="parentRouter" />
    <property name="attachments">
        <map>
            <entry key="/filter/{filterAttribute}/{filterValue}" value-ref="filterExtractor" />
            <entry key="">
                <bean class="org.restlet.ext.spring.SpringFinder">
                    <lookup-method name="create" bean="dataResource" />
                </bean>
            </entry>
        </map>
    </property>
</bean>

<bean id="extractor" class="ca.uhnresearch.pughlab.tracker.extractor.FilterExtractor">
    <property name="next" ref="router"/>
</bean>

所以这开始了,但是当应用程序启动时我在org.restlet.util.WrapperList.iterator 中遇到堆栈溢出,所以看起来递归路由器/提取器初始化正在破坏 Restlet 初始化过程。

两个问题,因此:

  1. Restlet 是否允许递归路由? (文档似乎没有涉及到这一点)
  2. 实现递归 URL 路由的最佳方式是什么?

【问题讨论】:

    标签: url routes restlet


    【解决方案1】:

    Restlet 不支持这种方法。我看到实现类似的唯一方法是具有匹配模式startsWith的子路由器。

    我不确切知道您的用例是什么,但利用 HTTP 标头将过滤器属性/值放入请求中不是更好吗?我不确定这种方法是否真的是 RESTful ;-) 但我有兴趣了解更多细节......

    希望对你有帮助 蒂埃里

    【讨论】:

    • 很遗憾,因为这是一个合理的用例(恕我直言),而且 HTTP 标头技术有点作弊。一种选择是一个hacky router+extractor+looper,它会在最后转发之前尽可能多地剔除过滤器片段(本质上是一个*-type regexy匹配器等价物),但我对参考用法不够好知道如何咀嚼。另一种是将所有内容转储到查询字符串中,然后从资源路径中脱离上下文。我真的不明白startsWith 是如何让我到达任何地方的,因为真的可能有零匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多