У меня есть веб-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, с соответствующим внешним интерфейсом;но я не могу ссылаться на него на стороне сервера, не предоставив данные, которые должны поступить позже, из пользовательского ввода.Какой лучший способ сделать это?