从增加的开销来看,分层的RESTful网址仍然比平面网址更受欢迎?

rob*_*les 4 rest url-design

假设我有一个网站,用户可以上传和显示他们的照片.该用户的单张图片的RESTful网址如下所示:

http://api.gallery.com/users/{user-id}/images/{image-id}
Run Code Online (Sandbox Code Playgroud)

但是image-id本身已经是唯一的了,所以这个url已经足够好了它:

http://api.gallery.com/images/{image-id}
Run Code Online (Sandbox Code Playgroud)

从REST的角度来看,第一个是有利的,但后来我应该验证,这个图像真的来自这个用户,因为有人可以改变网址,将用户ID改为别人的.在后一种情况下,我不需要添加此检查,这意味着更少的处理时间.

在这种情况下RESTful仍然是首选吗?

小智 8

简而言之,两者都是首选; 两者都可以返回相同的"事物",但"上下文"是不同的.

我们来看看您的网址:

  • /users: 所有用户
  • /users/1:用户#1
  • /users/1/images:所有用户#1的图像
  • /users/1/images/1:用户#1的图像#1

所有上述URL都围绕"用户"资源.它是"所有用户","用户","用户的图像"等.

  • /images:所有图像
  • /images/1:图像#1

所有上述URL都围绕"图像"资源.它是"所有图像"或"图像".

现在,从表面上看,这种区别似乎相对较小,但在构建API时,差异会对数据的消耗方式产生很大影响.

例如,假设您想要获取所有用户#1图像的列表,这是首选的?

/users/1/images

要么

/images?where=user.id eq 1

第一个代表我们想要的,更受限制,更容易理解,但是,它并不意味着我们不应该支持第二个形式,因为查询的能力非常有用.

现在,如果你想获得一个图像列表及其相关用户呢?

/users/???

要么

/images?include=user

在这种情况下,第一个URL根本没有多大意义,因为我们试图获取图像列表而不是用户,而第二个URL 正好代表我们想要的.

现在,关于安全性,理想情况下应该以对消费者完全透明的方式进行.消费者应该能够说"我想要所有图像".并且只接收他们可以访问的所有图像.如果他们尝试访问他们无权访问的特定资源,则应返回适当的HTTP错误代码.