【问题标题】:Restlet URL/path pattern mismappingRestlet URL/路径模式错误映射
【发布时间】:2016-11-22 12:48:45
【问题描述】:

我正在使用 Restlet 开发一个 REST API。

到目前为止,一切正常。但是,我现在遇到了将 URL 映射到 ServerResourceRouter 的问题。

我有以下场景:

  • GET /car 返回所有汽车的列表
  • GET /car/{id} 返回 id 为 1 的汽车的详细信息
  • GET /car/advancedsearch?param1=test 应该使用一些参数对所有汽车进行搜索

前两个调用没有任何问题。但是,如果我尝试拨打第三个电话,Restlet Router 会以某种方式将其映射到第二个电话。如何让 Restlet 改用第三种情况?

我的映射定义如下:

router.attach("/car",                CarListResource.class);
router.attach("/car/{id}",           CarResource.class);
router.attach("/car/advancedsearch", CarSearchResource.class);

CarSearchResource 从未被调用,而是请求以CarResource 结束。

路由器的默认匹配模式设置为Template.MODE_EQUALS,所以不会导致它。

有没有人有任何进一步的建议我可以如何解决它?


请不要建议将/car 与参数一起使用,因为在该级别上已经有另一种搜索方式。另外,我无法控制 API 结构,所以它必须保持原样。

【问题讨论】:

    标签: java rest uri restlet url-pattern


    【解决方案1】:

    您需要将.setMatchingQuery(true); 添加到该路由,以便它识别它在其末尾带有查询。

        Router router = (Router) super.createInboundRoot();
        TemplateRoute route1 = router.attach("/car/advancedsearch?{query_params}", MyResource.class);
        route1.setMatchingQuery(true);
        return router;
    

    请注意,此模式与您在路线中确定的确切特定顺序一致,即 advancedsearch 在前,query_params 在后

    【讨论】:

    • 我不必为主要的/car 路径执行此操作,并且该路径也使用参数。此外,它必须是/car/advancedsearch,而不是/advancedsearch
    • 我现在也试过了,结果还是一样。
    • 它只适用于查询表单
    • 对不起,我不明白你的评论。 /car/car/advancedsearch both 在我的例子中都有查询参数。第一个现在可以正常工作,第二个不行。
    【解决方案2】:

    我可以通过简单地重新排序 attach 语句来解决这个问题:

    router.attach("/car/advancedsearch", CarSearchResource.class);
    router.attach("/car",                CarListResource.class);
    router.attach("/car/{id}",           CarResource.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 2018-10-06
      • 1970-01-01
      • 2014-03-08
      • 2011-05-12
      • 2017-03-27
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多