Проблемы с REST API - PullRequest
       12

Проблемы с REST API

3 голосов
/ 02 мая 2020

При создании приложения для отдыха у меня была большая проблема. Он заключается во вложении элементов и в неправильном понимании того, как правильно передать их через контроллер покоя. У меня есть что-то вроде следующей структуры:

public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
    @JsonManagedReference
    private List<TaskCard> taskCards;
}

public class TaskCard {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "taskCard", fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<Task> tasks;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    @JsonBackReference
    private User user;
}

public class Task {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "task_card_id")
    @JsonBackReference
    private TaskCard taskCard;
}

Все эти классы являются сущностями. Как вы уже догадались, у меня есть контроллер отдыха для каждого из этих классов. Здесь начинаются проблемы. В моей голове структура моего API для отдыха должна выглядеть примерно так: /users/1/taskkards/1/tasks/1/. Это выглядит сложно, верно? Точно! Когда я пытаюсь просто получить пользователя, то в принципе нет никаких проблем, я могу просто отправить /users запрос, который обработает мой контроллер остальных пользователей. Но если мы перейдем к карте задач, то проблемы уже есть. Оказывается, мой TaskCardController должен выглядеть следующим образом:

@RestController
@RequestMapping("users/{userId}/taskcards")
public class TaskCardController {

    // get, post, update, delete methods

}

Это уже означает, что я должен также перенести сюда информацию о пользователе, чтобы убедиться, что карта задач принадлежит ему. Но в то же время, поскольку у моего пользователя есть поле карточек задач, откуда я могу получить это значение? Нужно ли go в хранилище и искать его в базе данных или просто делать что-то подобное?

@GetMapping
public List<TaskCard> getAllTaskCards(@PathVariable("userId") User user) {
    return user.getTaskCards();
}

Это вообще нормально, что такое вложение возникает? Зачем мне тогда создавать контроллеры для TaskCard и Task, если я могу просто получить их от пользователя? Это тоже одна из проблем. Если мы еще дойдем до этой задачи, то здесь все очень плохо. Мой контроллер задач должен выглядеть так?

@RestController
@RequestMapping("users/{userId}/taskcards/{cardId}/tasks")
public class TaskController {

    // get, post, update, delete methods

}

Что-то говорит мне нет. Это будет ужасно, если мне нужно будет получить пользователя и карточку задачи для запроса задачи. Что мне делать в этой ситуации? Как правильно спроектировать мой API отдыха?

1 Ответ

1 голос
/ 03 мая 2020

Для контроллеров Task и TaskCard просто отправьте JSON с клиента и затем выберите соответствующего пользователя из базы данных. Например,

@RestController
@RequestMapping("/taskcards")
public class TaskCardController {
    @Autowired
    private UserRepo userRepo; // supposing you are using Spring Data repositories


    @PostMapping("/addTaskCard")
    public ResponseEntity addTaskCard(@RequestBody TaskCard newTaskCard){
        User user = userRepo.getUserById(newTaskCard.getUser().getId());
        user.getTaskCards().add(newTaskCard);
        userRepo.save(user);

        return ResponseEntity.ok().build();

    }

}

Вы можете продолжить использовать этот метод. Отправьте достаточно данных от клиента, а затем в серверной части выполните ваши запросы и получите другие связанные объекты из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...