我们正在开发基于REST的服务,我们正在使用Spring MVC。我们正面临方法解决问题的网址。这大致是我们想要做的事情
假设我们有宠物的人
//Class level request mapping
@RequestMapping("/persons")
// Mapping to access a specific person inside one of the methods
@RequestMapping(value="/{personId}", method= RequestMethod.GET
//.... getPerson method
// Mapping to access a specific person's pets inside one of the methods
@RequestMapping(value="/{personId}/pets", method= RequestMethod.GET
// getPersonPets method
如果请求为“/ persons / P12323233”,其中P12323233是人员ID,则它将解析为getPerson方法。 如果请求为“/ persons / P12323233 / pets”,其中P12323233是person id,则它将解析为getPersonPets方法。
所以一切都很好,直到现在。但 如果请求是“/ persons / pets”,请求会解析为getPerson方法。虽然我们可以在getPerson方法中处理这个错误情况,但我们正在尝试检查是否有解决此调用getPersonPets方法的问题
我们仍然在争论处理这种情况的正确位置是getPerson还是getPersonPets方法。除了这个辩论之外,我们想知道实现解决getPersonPets方法是否技术可行。
感谢任何帮助。
答案 0 :(得分:1)
这可以通过为同一方法添加多个映射来解决:
@RequestMapping(value="/{personId}", method= RequestMethod.GET
//.... getPerson method
@RequestMapping(value = {"/{personId}/pets", "/pets"}, method= RequestMethod.GET
// getPersonPets method
<强>更新强> 请注意,在访问 / pets 时,使用以下签名将引发异常,因为URL中不存在 personId :
public String showPets(@PathVariable("personId") long personId)
这是访问变量最方便的方法,但鉴于我们有多个路径映射相同的方法,我们可以将签名更改为以下内容以避免异常:
public String showPets(@PathVariable Map<String, String> vars)
从地图中检索路径变量
答案 1 :(得分:1)
您也可以使用正则表达式并过滤掉404这样的请求。例如:
// Mapping to access a specific person inside one of the methods
@RequestMapping(value="/{personId:P[\\d]+}", method= RequestMethod.GET
//.... getPerson method
// Mapping to access a specific person's pets inside one of the methods
@RequestMapping(value="/{personId:P[\\d]+}/pets", method= RequestMethod.GET
// getPersonPets method
答案 2 :(得分:0)
虽然通常REST假设您在资源上未指定段时引用ID,但我喜欢添加id,以使其余端点不那么模糊。
如果允许您更改API,请考虑执行以下操作:
//Class level request mapping
@RequestMapping("/persons")
// Mapping to access a specific person inside one of the methods
@RequestMapping(value="/id/{personId}", method= RequestMethod.GET
//.... getPerson method
// Mapping to access a specific person's pets inside one of the methods
@RequestMapping(value="/id/{personId}/pets", method= RequestMethod.GET
// getPersonPets method