0

我正在开发的 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 并使用一半来找到正确的用户,然后在解析另一半时将其用作参数。

4

2 回答 2

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) {
       // ...
   }
}
于 2013-08-22T08:34:54.280 回答
0

看看Spring Data REST

此 APISimpleJpaRespository向 Web 公开,可通过 RESTful 路径访问。

于 2013-08-22T10:03:40.977 回答