我正在开发的REST-API允许访问各种用户数据。
可以通过他们的ID,他们的电子邮件或用户名识别用户。然后,用户还有一些其他数据,例如订单等。
现在我打算公开以下端点:
正如您所看到的,URL总是包含两个"部分":一个用于识别用户,另一个用于识别资源。
如果我现在可以避免在我的控制器中编写9种不同的方法(因为将来可能会有其他类型的信息),那将是很棒的。
是否有可能编写一个UserController
然后由MainController
返回并参数化?
public class UserController {
@RequestMapping("/profile")
public ModelAndView profile(User user) {
//...
}
@RequestMapping("/orders")
public ModelAndView profile(User user) {
//...
}
@RequestMapping("/address")
public ModelAndView profile(User user) {
//...
}
}
@RequestMapping("/rest/user")
public class MainController {
@RequestMapping("byemail/{email}")
public ??? byEmail(@PathVariable String email) {
User user = //Find user by email
//???
}
@RequestMapping("byusername/{username}")
public ??? byUserName(@PathVariable String username) {
User user = //Find user by username
//???
}
@RequestMapping("byid/{id}")
public ??? byId(@PathVariable String id) {
User user = //Find user by id
//???
}
}
或者是否可以通过某种路由来解决这个问题? 然而,重要的是"分裂" URL并使用一半来查找正确的用户,然后在解析下半部分时将其用作参数。
答案 0 :(得分:2)
为什么不只有一个带有这些请求映射的控制器?
@RequestMapping("/rest/user")
public class UserController {
@RequestMapping("{keyType}/{key}/orders")
public ModelAndView orders(@PathVariable String keyType, @PathVariable String key) {
User u = findUser(keyType, key);
// ...
}
@RequestMapping("{keyType}/{key}/profile")
public ModelAndView profile(@PathVariable String keyType, @PathVariable String key) {
User u = findUser(keyType, key);
// ...
}
@RequestMapping("{keyType}/{key}/address")
public ModelAndView address(@PathVariable String keyType, @PathVariable String key) {
User u = findUser(keyType, key);
// ...
}
private User findUser(String keyType, String key) {
// ...
}
}
答案 1 :(得分:0)
此API向网络公开SimpleJpaRespository
,可通过RESTful路径访问。