我正在编写一个非常简单的rest API,这是我的第一次尝试,我将使用spring框架。
测试应用仅处理产品,类别和类型。一个产品有一个类型,一个类别有很多类型,一个产品也可以有多个类别,它可以适应,所以我想知道我是否应该为每个创建一个弹簧控制器。
如果我这样做,那么在通过类别控制器打电话时是否可以取回产品,这是不是o.k?
我的意思是这样的:
/categories/{category_id}/types/{type_id}/products
对我来说,这会按类别过滤,然后按类型过滤并获取该类型的所有产品,或者这不是很安静吗?
答案 0 :(得分:2)
休息模式应该简单而不是分层。
如果你想要检索东西,它们应该是直截了当的,如:
/categories/{category_id}
/products/{product_id}
/types/{type_id}
对于过滤,您应该使用查询字符串而不是url路径,因为url路径关心顺序/层次结构,而过滤不应该关注顺序。
答案 1 :(得分:1)
是的,你可以。这个API对我来说很好看。如果您正在寻找实施,请参阅下文。
以下功能可以正常使用
@RequestMapping(value="/categories/{category_id}/types/{type_id}/products", method = RequestMethod.GET)
@ResponseBody
public void test(
@PathVariable String category_id,
@PathVariable String type_id)
{
}
如果需要,可以为属性绑定属性编辑器并键入对象,并将它们作为对象传递给函数。
答案 2 :(得分:1)
我认为你应该有一个ProductController可以通过一个或多个参数获得产品。我会使用查询参数而不是路径参数,因为路径参数会让人感到困惑。当您查询多个类别或类型时。所以有一个像;
这样的服务/product/list?category=a,b,c&type=abcd
/product/get/id=123 or /product/get/{id}
您可以拥有类别和控制器的控制器允许列出和创建/更新/删除(如果支持)的类型。
/category/get?id=123
/types/get?id=123
答案 3 :(得分:1)
最常见的是你将其建模为
/category/
/product/
/type/
(对于POST,带有PUT和DELETE的尾随ID),然后您可以按如下方式查询(GET)产品和类别
/product/?category_id=123
/product/?type_id=12
/category/?name=big+items
当您拥有1:1的关系时,您还可以考虑将类别和类型组合到一个实体中。也许类型是类别的属性,反之亦然。
根据您的规范,
/categories/{category_id}/types/{type_id}/products
由于类别和类型之间存在1:1的关系,{type_id}实际上是多余的。
另一方面,
/categories/{category_id}/products/
很好,但是一次只能搜索一个类别。
PS。 “type”通常是保留关键字,可能会导致奇怪的错误消息