我正在编写基于resteasy的基于Java的REST API。我有以下结构
类别有很多组;小组有很多偏好
我有3个资源1.类别2.组3.偏好
我想支持这些API端点
/categories/{cat_id}/groups/
(返回该类别的所有群组)/groups/{group_id}/preferences/
(返回该组的所有首选项)/preferences/{preference_id}
(返回由传递的id标识的pref)/preferences
(返回所有首选项)对于上面提到的每种资源,我有3个资源类
我很困惑如何构建方法以及它们应该去哪里。以下是我的具体问题
/groups/{group_id}/preferences/
实施应该在GroupsResourceImpl
班级或PreferenceResourceImpl
班级
PreferenceResourceImpl
类具有/preferences
端点的实现,它返回所有全局首选项。因此,如果/groups/{groupid}/preferences
端点位于GroupResource
下并调用PreferenceResource
上的方法(将组ID作为额外参数的方法)?
答案 0 :(得分:0)
基本上,实现没有区别,你可以这样做。您应该按照以最合乎逻辑的方式对代码进行分组的方式对它们进行分组。
我个人喜欢将资源实现分组为将类似代码组合在一起的方式。这可以通过将需要类似方法从基础结构中提取的路径组合在一起来实现。例如,如果您的所有数据都在关系数据库中,那么您的所有/*/preferences
查询基本上都是SELECT * FROM preferences WHERE ...different stuff...
。因此,通过您查询的表对它们进行分组是最合乎逻辑的。例如:
GroupResource:
/categories/{cat_id}/groups/
因为它总是从表"群组":SELECT * FROM groups WHERE parent_cat_id = {cat_id}
PreferenceResource:
/groups/{group_id}/preferences/
,/preferences/{preference_id}
,/preferences
。
因为它始终会从表格"首选项":SELECT * FROM preferences WHERE parent_group = {group_id}
,... WHERE id = {preference_id}
,SELECT * FROM preferences
但是,如果您的类别/组/首选项位于某种图形数据库中 - 那么要查询/groups/{group_id}/preferences
,您需要先找到一个组,然后从内部获取所有首选项,因此,它将这样的资源分组更合乎逻辑:
CategoryResource:
/categories/{cat_id}/groups/
因为它会开始查询"类别"图表:categories.get(cat_id).getGroups()
GroupResource:
/groups/{group_id}/preferences/
因为它会从"群组开始查询"图表:groups.get(group_id).getPreferences()
PreferenceResource:,
/preferences/{preference_id}
,/preferences
。
因为它会从"偏好开始查询"图表:preferences.get(preference_id)
和preferences.getAll()