我不是那么喜欢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
这些推理是正确的还是我错过了什么?
答案 0 :(得分:0)
你的假设是正确的。您建议的映射中的哪个映射完全取决于您的模型。 Martin Fowler有一篇关于Richardson Maturity Model的好文章,总结如下:
对于您的项目,您可以使用jhipster因为它在REST-ful设计下为您提供角度最好的弹簧。
答案 1 :(得分:0)
网址不得包含动词。动词由方法提供,在你的情况下 - 惊喜,惊喜 - GET。
ByRoomId
也毫无意义,因为这就是?roomId=
所说的。
离开AllImages
,其中All
是多余的。
这会产生网址/RoomMedia/Images?roomId=7
。如果有的话,RoomMedia
和Images
之间的关系还不清楚。如果RoomMedia
指的是某个房间,那么您的建议/RoomMedia/7/Images/
就是正确的。
/RoomMedia/7/Images/1
值得怀疑。它应该是/Images/1
。与id为1的图像位于哪个房间无关。
设计REST API时,首先要考虑要公开的所有资源及其关系。之后,URL会自动显示自己,可以这么说。