我正在开发的 REST-API 允许访问各种用户数据。
用户可以通过他们的 ID、他们的电子邮件或他们的用户名来识别。然后,用户有几个其他数据,例如订单等。
现在我打算公开以下端点:
- /rest/user/byemail/test@example.org/profile
- /rest/user/byemail/test@example.org/orders
- /rest/user/byemail/test@example.org/address
- /rest/user/byid/123456/profile
- /rest/user/byid/123456/orders
- /rest/user/byid/123456/地址
- /rest/user/byusername/test/profile
- /rest/user/byusername/test/orders
- /rest/user/byusername/test/address
如您所见,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 并使用一半来找到正确的用户,然后在解析另一半时将其用作参数。