【问题标题】:When to use Restlet router v. Component with multiple routes何时使用 Restlet 路由器 v. 具有多个路由的组件
【发布时间】:2013-05-06 23:06:14
【问题描述】:

我已经使用此代码和组件创建了多个路由:

Component component = new Component();
component.getServers().add(Protocol.HTTP, port);
component.getDefaultHost().attach(pair.uriPattern, pair.restlet);
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());

我的心跳代码有效。

但是当我使用路由器作为上面的pair.restlet 时,它不起作用:

Router router = new Router();
Restlet fooHandler = new FooRouter();
Restlet barHandler = new BarRouter();

router.attach("/foo/{fooId}", fooHandler);
router.attach("/bar/{barId1}/{barId2}", barHandler);

Restlet 文档仅给出了使用带有Application 类的路由器的示例:

public class FirstStepsApplication extends Application {

    @Override
    public synchronized Restlet createInboundRoot() {
        Router router = new Router(getContext());
        router.attach("/hello", HelloWorldResource.class);
        return router;
    }
}

实际上使用我的基于路由器的代码与点击一个不存在的 URL 的效果相同。

所以我问:

  1. 基于路由器的方法应该实现的目标与基于组件的方法之间有什么区别吗?
  2. 我可以使用基于路由器的方法使此代码工作吗?到目前为止,我唯一的解决方案是废弃多个路由器并附加多个组件,这需要处理更多遗留代码。

【问题讨论】:

    标签: java servlets restlet


    【解决方案1】:

    我看不出在虚拟主机附件上使用路由器有什么问题,因为 Restlet 允许复合元素来构建请求处理链。

    这里的问题是路由器可以支持多个路由,而您使用精确匹配模式(实际上是默认模式)。

    我们来取样。如果pair.uriPattern 包含/test 并且您在此路由上连接了一个路由器。无论您在路由器上指定什么,都只会处理路径/test(空路由除外;-)

    我猜你想实现子路由匹配,所以你应该考虑在将路由器附加到虚拟主机时使用开始匹配:

    Router router = (...)
    
    Component component = new Component();
    component.getServers().add(Protocol.HTTP, port);
    component.getDefaultHost()
                 .attach(pair.uriPattern, router)
                 .setMatchingMode(Template.MODE_STARTS_WITH);
    component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());
    

    在这种情况下,所有以pair.uriPattern 开头的请求都将由路由器处理。所以路由器应该这样定义:

    Router router = new Router();
    router.attach("/something", yourRestlet1);
    router.attach("/somethingelse", yourRestlet2);
    

    在这种情况下,我们会有以下行为:

    • 路由pair.uriPattern + "/something" 将使用yourRestlet1 处理
    • 路由pair.uriPattern + "/somethingelse" 将使用yourRestlet2 处理

    事实上,这种方法是组织应用程序代码的好方法。

    希望对你有帮助 蒂埃里

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多