Restlet URL/path 模式错误映射
Restlet URL/path pattern mismapping
我正在使用 Restlet 开发 REST API。
到目前为止一切正常。但是,我现在遇到了 URL 到 ServerResource
的 Router
映射的问题。
我遇到了以下情况:
- GET
/car
returns 所有汽车的列表
- GET
/car/{id}
returns 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 结构,因此它必须保持原样。
您需要将 .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
在
之后
我可以通过简单地重新排序 attach
语句来解决这个问题:
router.attach("/car/advancedsearch", CarSearchResource.class);
router.attach("/car", CarListResource.class);
router.attach("/car/{id}", CarResource.class);
我正在使用 Restlet 开发 REST API。
到目前为止一切正常。但是,我现在遇到了 URL 到 ServerResource
的 Router
映射的问题。
我遇到了以下情况:
- GET
/car
returns 所有汽车的列表 - GET
/car/{id}
returns 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 结构,因此它必须保持原样。
您需要将 .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
在
我可以通过简单地重新排序 attach
语句来解决这个问题:
router.attach("/car/advancedsearch", CarSearchResource.class);
router.attach("/car", CarListResource.class);
router.attach("/car/{id}", CarResource.class);