使用Path参数区分url

时间:2013-08-22 11:26:37

标签: spring spring-mvc

我们正在开发基于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方法是否技术可行。

感谢任何帮助。

3 个答案:

答案 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