RESTful API - 无法决定使用哪种路由表单

时间:2017-10-19 10:08:44

标签: rest

我为我的问题选择正确的路线感到困惑。 我的数据库中有食物条目,还有这种食物的照片。因此,当我想列出一些食物的所有照片时,我会使用这条路线:

GET /food/{id}/photos 

当我想在某些食物中添加一些照片时,我会用它:

POST /food/{id}/photos

现在问题是删除食物的照片。因为每个用户都可以发布更多相同食物的照片,所以我不能简单地使用这个:

DELETE /food/{id}/photos

我看到两种可能的方法来解决这个问题:

DELETE /food/{food_id}/photos/{photo_id}
DELETE /photos/{id}

关于第一个我喜欢与其他照片路线的一致性。但我不喜欢食物ID形式的冗余,因为每张照片都有唯一的ID,所以在这种情况下食物ID是无关紧要的。

第二种解决方案更干净,但与其他路线没有一致性。我的意思是创建照片是通过/ food /前缀,删除没有这个前缀。

您建议使用哪条路线?

2 个答案:

答案 0 :(得分:0)

使用'/food/{food_id}/photos/{photo_id}'时,photo_id不必全局唯一。如果它在'/food/{food_id}'的上下文中是唯一的,那就足够了。这意味着您不必使用UUID或碰撞概率较低的大型结构。它可以是一个简单的增加数字甚至是一个简短的可读文本。

使用/food/{food_id}/photos/{photo_id}也可以更好地扩展,因为您有机会处理不同服务器上的资源,并且分层URI提供了实现路由的机会。

如果您使用/photos/{id},则所有照片都应保存在某种全局商店中(除非ID具有某种内部结构)。

答案 1 :(得分:0)

我认为Rest网址 DELETE / food / {food_id} / photos / {photo_id} 适合作为 DELETE / photos /的更好解决方案{ID}

由于我已阅读网址 / food / {food_id} / photos / {photo_id} ,因此我将其阅读为“删除特定食物的照片”# 39;这是您的要求,就像您尝试阅读 DELETE / photos / {id} 一样,删除带照片ID的照片,但它不会告诉您哪种食物正在删除照片。

进一步阅读:

  1. https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9
  2. http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
  3. 注意:请参阅DELETE资源的示例。