在REST Web控制器中添加指向POST / PUT / PATCH操作的链接

时间:2019-06-17 21:30:14

标签: java rest spring-boot spring-hateoas

我有一个用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函数实现了客户端代码;但是我不能在服务器端链接到它,而不必提供以后应该来自用户输入的数据。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

与团队负责人交谈后,我已经解决了该问题。显然,在上述情况下,可以将 null 或空的DTO对象作为参数传递; HATEOAS实现特别关心路径中的那些参数,并且粗略地说会忽略其他参数。然后,在用户执行操作/插入输入后,可以根据需要在客户端上替换这些内容。