我需要构建一个用于获取对象的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
有更好的方法吗?
提前致谢, 金
答案 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 选项。