Rest API - 弹簧控制器和资源

时间:2015-07-07 17:43:37

标签: java spring rest

我正在编写一个非常简单的rest API,这是我的第一次尝试,我将使用spring框架。

测试应用仅处理产品,类别和类型。一个产品有一个类型,一个类别有很多类型,一个产品也可以有多个类别,它可以适应,所以我想知道我是否应该为每个创建一个弹簧控制器。

如果我这样做,那么在通过类别控制器打电话时是否可以取回产品,这是不是o.k?

我的意思是这样的:

/categories/{category_id}/types/{type_id}/products

对我来说,这会按类别过滤,然后按类型过滤并获取该类型的所有产品,或者这不是很安静吗?

4 个答案:

答案 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”通常是保留关键字,可能会导致奇怪的错误消息