我正在使用Restlet开发REST API。
到目前为止,一切都运转得很好。但是,我现在遇到了将Router
网址映射到ServerResource
的问题。
我有以下情况:
/car
返回所有汽车的列表/car/{id}
返回ID为/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结构,因此必须保持原样。
答案 0 :(得分:0)
您需要将.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
出现在
答案 1 :(得分:0)
我只需重新排序attach
语句就可以解决这个问题:
router.attach("/car/advancedsearch", CarSearchResource.class);
router.attach("/car", CarListResource.class);
router.attach("/car/{id}", CarResource.class);