Spring Boot REST路径映射

com*_*rex 6 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
Run Code Online (Sandbox Code Playgroud)

问题是 - 创建控制器的最佳实践是什么.例如,我们有UserController,我们在技术上可以放置所有这些映射.或者 - 我们应该创建单独的控制器(UserController,ContactsController).如果我们把所有东西放在下面,请在下面的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() {}

    .....
}
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*man 6

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

UserController -> UserService -> UserRepository,

ContactController -> ContactService -> ContactRepository,

FriendshipController -> FriendshipService -> 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) {
...
Run Code Online (Sandbox Code Playgroud)

与用户范围 Friendship 控制器相关:

@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) {

...
Run Code Online (Sandbox Code Playgroud)

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

  • 我什至建议友谊控制器的映射应该是`@RequestMapping("/user/{id}/friendship")`,然后所有其他映射都被简化为`/code` (3认同)