我有一个用Java编写的Web API,其中有处理HTTP请求的Web控制器。我正在尝试使用Spring Boot使用HATEOAS实现RESTful架构。在方法中添加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,因此无法将其提供给链接。如何以一种允许我调用该方法的方式将链接添加到对象?
我想要类似的东西:
房间|删除|编辑
在客户端上,如果单击“删除”,则将删除会议室;如果单击“编辑”,则客户端将展开并带有文本框,允许我插入所需的参数来编辑会议室。我已经为带有适当前端的Edit函数实现了客户端代码;但是我不能在服务器端链接到它,而不必提供以后应该来自用户输入的数据。最好的方法是什么?
答案 0 :(得分:0)
与团队负责人交谈后,我已经解决了该问题。显然,在上述情况下,可以将 null 或空的DTO对象作为参数传递; HATEOAS实现特别关心路径中的那些参数,并且粗略地说会忽略其他参数。然后,在用户执行操作/插入输入后,可以根据需要在客户端上替换这些内容。