如何使用Spring MVC \ Boot正确实现RESTful WS架构?

时间:2016-11-21 22:44:49

标签: rest spring-mvc spring-boot restful-architecture spring-restcontroller

我不是那么喜欢RESTful Web服务,我对如何在我的服务器上正确实现RESTful样式有一些疑问,Spring应用程序(Spring MVC是同样的事情)。

所以基本上我有一些像这样的控制器类:

@RestController
@RequestMapping("/RoomMedia")
public class RoomMediaController {

    private static final Logger log = LoggerFactory.getLogger(RoomMediaController.class);

    @Autowired
    private RoomMediaService roomMediaService;

    public RoomMediaController() {
        log.debug("RoomMediaController init");
    }


    @RequestMapping(value = "getAllImagesByRoomId",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<byte[]>> getAllImagesByRoomId(Long roomId) throws DataAccessException {

        log.debug("getAllImagesByRoomId START");

        List<byte[]> result = roomMediaService.getRoomImageListById(roomId);

        log.debug(result.toString());

        log.debug("getAllImagesByRoomId END");

        return ResponseEntity.ok(result);

    }
}

我认为,如果基本思想像RESTful一样,它也不能被视为真正的RESTful WS。

我认为主要问题与端点有关: getAllImagesByRoomId()方法处理对此URL的HTTP GET请求,如下所示: / RoomMedia / getAllImagesByRoomId ?roomId = 7

据我所知,阅读一些教程这不是REST风格,因为我必须在不传递参数的情况下访问资源,我必须这样做:

/ RoomMedia /图片/ 7

我的推理是否正确?

此外,我认为前面的方法在实现中也非常简单:此方法返回与 id = 7 的房间相关联的所有图像的列表(这是一个与酒店相关的应用程序) )。

据我所知,它的逻辑也是RESTful原则。

以下列方式组织起来会更好吗?

执行 GET 请求,如下所示:

  • / RoomMedia / 7 / Images / :我必须获取与 id = 7 的房间相关联的所有图片列表 URI (或者更好地处理像 / 7 / RoomMedia / Images / 这样的路径?)。

  • / RoomMedia / 7 / Images / 1 我获得 id = 1 id = 7

这些推理是正确的还是我错过了什么?

2 个答案:

答案 0 :(得分:0)

你的假设是正确的。您建议的映射中的哪个映射完全取决于您的模型。 Martin Fowler有一篇关于Richardson Maturity Model的好文章,总结如下:

  • 1级通过使用分而治之来解决处理复杂性的问题,将大型服务端点分解为多个资源。
  • Level 2引入了一组标准动词,以便我们以相同的方式处理类似情况,从而消除不必要的变化。
  • Level 3引入了可发现性,提供了一种使协议更具自我文档的方法。

对于您的项目,您可以使用jhipster因为它在REST-ful设计下为您提供角度最好的弹簧。

答案 1 :(得分:0)

网址不得包含动词。动词由方法提供,在你的情况下 - 惊喜,惊喜 - GET。

ByRoomId也毫无意义,因为这就是?roomId=所说的。

离开AllImages,其中All是多余的。

这会产生网址/RoomMedia/Images?roomId=7。如果有的话,RoomMediaImages之间的关系还不清楚。如果RoomMedia指的是某个房间,那么您的建议/RoomMedia/7/Images/就是正确的。

/RoomMedia/7/Images/1值得怀疑。它应该是/Images/1。与id为1的图像位于哪个房间无关。

设计REST API时,首先要考虑要公开的所有资源及其关系。之后,URL会自动显示自己,可以这么说。