Добавление ссылок на операции POST / PUT / PATCH в веб-контроллерах REST - PullRequest
1 голос
/ 18 июня 2019

У меня есть веб-API, написанный на Java, где у меня есть веб-контроллеры, обрабатывающие HTTP-запросы.Я пытаюсь реализовать архитектуру RESTful с HATEOAS, используя Spring Boot.Добавляя ссылки HATEOAS в методы, я легко могу добавить ссылки для запросов GET / DELETE, но у меня возникают проблемы с запросами POST / PUT / PATCH, в основном потому, что они требуют от меня предоставления тела того, что я хочу опубликовать, обычно вФормат JSON.Я уже некоторое время гуглю и не могу понять, как это сделать.

Вот как я добавляю ссылки на операции GET / DELETE.

    /**
     * Shows all the Rooms present in the database.
     *
     * @return OK status and a list of Room Minimal DTO.
     */
    @GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> getRooms() {
        List<RoomDTOMinimal> roomDTOList = roomRepository.getAllDTOWebInformation();
        for (RoomDTOMinimal r : roomDTOList) {
            if (userService.getUsernameFromToken().equals("ADMIN")) {
                Link roomSensors = linkTo(methodOn(RoomsWebController.class).getSensors(r.getName())).withRel("Get Room" +
                        "Sensors");
                Link deleteRoom = linkTo(methodOn(RoomsWebController.class).deleteRoom(r)).withRel("Delete this Room");
                r.add(roomSensors);
                r.add(deleteRoom);
            } else if (userService.getUsernameFromToken().equals("REGULAR_USER")) {
                Link roomTemp = linkTo(methodOn(RoomsWebController.class).getCurrentRoomTemperature(r.getName())).
                        withRel("Get Room Temperature");
                r.add(roomTemp);
            }
        }
        return new ResponseEntity<>(roomDTOList, HttpStatus.OK);
    }

Я хочучтобы добавить ссылку на запрос editRoom, что-то вроде:

                Link editRoom = linkTo(methodOn(RoomsWebController.class).configureRoom(r.getName(),  WHAT GOES HERE???).withSelfRel();

Но configureRoom принимает в качестве roomName и roomDTO в своей подписи.RoomDTO - это @RequestBody, поэтому я не могу передать его по ссылке.Как мне добавить ссылку на объекты таким образом, чтобы я мог вызвать этот метод?

Я бы хотел что-то вроде:

ROOM |Удалить |Редактировать

На стороне клиента, где, если я нажимаю УДАЛИТЬ, комната удаляется, а если я нажимаю Изменить, сторона клиента расширяется с текстовыми полями, что позволяет мне вставить необходимые параметры для редактирования комнаты.У меня есть клиентский код, реализованный для функции Edit, с соответствующим внешним интерфейсом;но я не могу ссылаться на него на стороне сервера, не предоставив данные, которые должны поступить позже, из пользовательского ввода.Какой лучший способ сделать это?

1 Ответ

0 голосов
/ 18 июня 2019

С тех пор я решил это после разговора с лидером команды.По-видимому, допустимо передавать null или пустой объект DTO в качестве параметра в приведенном выше сценарии;Реализация HATEOAS особенно заботится о тех параметрах, которые относятся к пути, и грубо говоря игнорирует остальные.Затем они могут быть заменены по мере необходимости на стороне клиента при выполнении пользователем действия / вставки ввода.

...