GET的休息URL最佳实践

时间:2015-12-17 18:06:55

标签: api rest url

我需要构建一个用于获取对象的restful url,它与典型的/ objectService / objectId略有不同。

考虑我有一个" Fruit Service",我的服务可以在三个不同的表,Apple表,Banana表和Orange表上进行GET。所有获取都返回一个Fruit对象。

这是一种可接受的宁静模式吗?

/fruitService/apple/123
/fruitService/orange/456

该服务没有返回苹果或橙色物品,它正在返回"水果"对象,所以当123是水果的id而不是苹果对象时,我不确定是否可以使用apple / 123.

我认为这比

更好
/fruitservice/123?type=apple

有更好的方法吗?

提前致谢, 金

2 个答案:

答案 0 :(得分:0)

基于我对Ruby on Rails的经验(并不多)

  

/ fruitService /橙色/ 456

应该从oranges表返回带有id = 456的Orange对象。 这几乎是rails中的最佳实践。 在我看来,它看起来更好,似乎更合乎逻辑。如果您正在针对水果运行查询,这将是一个合适的网址。

  

/ fruitService /果/ 456

这消除了你api中的许多含糊之处。

答案 1 :(得分:0)

就个人而言,它会创建一个Fruits表,它将具有ID和引用苹果,橙色和香蕉表/实体/等等。重要的是来自Fruits表的ID将暴露给消费者,因此可以使用简单而优雅的端点:

/fruits/{FID}/

获得特定的水果。这样就可以避免将细节和模型暴露给消费者。

修改

如果您无法访问数据库,因此无法更改结构,我会选择以下端点:

/fruits/orange/{ID}/

等等。在REST中使用这些端点这是​​很常见的做法 - 我的意思是使用共同的根( fruits ),而不是 ID ,而是使用其他描述符( oranges >)。例如。 /food/categories//food/products/

使用上面提到的端点清楚地说明了什么是可用的类型,并使用户更容易更快地获得他们需要的东西。

这种解决方案的缺点是它违反了开放封闭原则。对于每个新表,都需要添加新的端点。

为了避免添加新的端点,您可以使用查询参数:

/fruits/{FID}/?view=orange

但您需要明确指定可用的 view 选项。