Spring Boot REST路径映射

时间:2016-10-11 19:56:11

标签: spring spring-boot spring-restcontroller spring-rest

我想,为休息服务创建PATH映射的最佳做法是什么。 让我们说我们有以下路径:

/users POST
/users/1 PATCH, GET
/users/1/contacts GET, POST
/users/1/contacts/1 GET, PATCH

问题是 - 创建控制器的最佳做法是什么。 例如,我们有UserController,我们在技术上可以放置所有这些映射。或者 - 我们应该创建单独的控制器(UserController, ContactsController)。 f.e下面的UserController,如果我们把所有东西放在。

之下
@RequestMapping("users")
@RestController
public class UserController {

    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<Void> createUser() {}

    @RequestMapping(method = RequestMethod.GET)
    public User getUser() {}

    @RequestMapping(value = "{id}/contacts", method = RequestMethod.GET)
    public List<Contact> getContacts() {}

    @RequestMapping(value = "{id}/contacts", method = RequestMethod.POST)
    public ResponseEntity<Void> createContact() {}

    .....
}

如果我们创建单独的控制器,那么应​​该如何组织路径呢? 可能这是一个愚蠢的问题,但如果有人可以分享经验,我会很高兴。

2 个答案:

答案 0 :(得分:3)

让我们建议将来与用户相关的实体数量会增加。所以很明显,最好根据实体进行拆分:

UserController - &gt; UserService - &gt; UserRepository,

ContactController - &gt; ContactService - &gt; ContactRepository,

FriendshipController - &gt;友谊服务 - &gt; FriendshipRepository

根据我的经验,用户控制器

@RestController
@RequestMapping("/user")
public class UserController extends AbstractController {

...

   @RequestMapping(method = RequestMethod.POST)
   public ResponseEntity<?> createUser(@RequestHeader("X-Auth-Token") Optional<String> @RequestBody User user) {

...

   @RequestMapping(method = RequestMethod.GET)
   public ResponseEntity<?> listUsers(@RequestHeader("X-Auth-Token") Optional<String> authToken) {
...

与用户范围相关的友谊控制器:

@RestController
@RequestMapping("/user/{id}")
public class FriendshipController extends AbstractController {

...

@RequestMapping(value = "/friendship/code", method = RequestMethod.POST)
    public ResponseEntity<?> generateCodeForUser(@PathVariable("id") long id) {

...

 @RequestMapping(value = "/friendship/code", method = RequestMethod.GET)
    public ResponseEntity<?> retrieveCodeForUser(@PathVariable("id") long id) {

...

不确定它是公理,但帮我组织代码。

答案 1 :(得分:1)

我是单独控制器的粉丝,因为它们会移除UsersContacts之间的耦合(例如) - 如果以后要在单独的上下文中使用Contacts会怎么样? (即独立于他们所属的User

如果它们分开,路径看起来与你的路径非常相似:

用户

/users GET, POST
/users/{user-id} PATCH, GET

联系人

/contacts GET, POST
/contacts/{contact-id} GET, PATCH

如果ContactsUsers之间存在依赖关系(在这种情况下,看起来有一个),您可以这样:

/contacts/for-user/{user-id} GET, POST
/contacts/for-user/{user-id}/{contact-id} GET, PATCH

这允许您将联系人添加到其他事物(不仅仅是用户)和用户添加到其他上下文(无论他们的联系人)

例如,咖啡机的用户

/coffee-maker/users GET

如果咖啡机出现故障,我们会联系谁进行维修?

/coffee-maker/contacts GET

咖啡机维修的联系人也可能是用户(但他们不一定要这样做)

还有一件事,你可以转过身来说一个联系人是用于器具(即咖啡机)

  /contact/for-appliance/{appliance-id} GET

我的观点是,如果您将联系人与用户分离,您可以将联系人分配给其他实体,而不是强制关系为User -> Contacts - 除非您当然不想要解耦他们是出于业务规则或某些原因

无论如何,请注意有很多方法可以进行映射