【问题标题】:Rest controllers for relation entities conventions关系实体约定的休息控制器
【发布时间】:2018-10-10 13:57:10
【问题描述】:

我有一个包含三个实体的简单 Java 应用程序:

User
Rent
Tool

用户可以租用多个工具,并且工具可以被多个用户租用。 Rent 实体用于跟踪租金历史记录,因此它与用户和工具具有多对一的关系。

目前我有两个休息控制器: 用户控制器 工具控制器 负责为用户或工具提供服务。

问题是现在我想返回特定用户的租金历史记录。我应该在 UserController 中使用映射创建方法吗

/users/{id}/rents

或者最好创建单独的控制器,如 RentController 和带有映射的方法

/rents?userId={userId}

我认为第一种方法在 URI 方面更干净,但我必须在 UserController 中使用 RentService,因为这些是来自不同包的类(我使用按功能包的方法)我觉得有问题。 问题还在于 POST 或 PUT 等方法,我认为最好的选择是这样的:

POST /rents - RentDto as body
PUT /rents/{id} - RentDto as body

或者有方法也可以:

GET /users/{id}/rents

在 RentController 中而不是在 UserController 中? 你如何解决这些问题,你有什么建议?

【问题讨论】:

  • 我将创建 RentController,并使用 CRUD 方法作为租金实体。这样,您就可以通过使课程保持单一目的来坚持 SOLID 原则。例如;。如果您必须检索工具的租金计数?您会向工具控制器添加另一种方法吗?这样用户和工具控制器都会有返回租金数据的方法,这并不完美。
  • Rent 表是否真的只包含两个实体之间的 manyToMany 关系,或者它可以扩展为包含一些额外的数据,例如租金特定信息?尽量避免让您的 UserResource/UserService 成为怪物,因为某些东西似乎在逻辑上适合那里。
  • 它还包含其他数据,例如工具租用日期和用户归还工具的日期。

标签: java rest spring-mvc


【解决方案1】:

当我们谈论 RESTful API 时,我们应该能够在没有额外参数的情况下访问任何 CRUD 方法,因此,考虑到这一点,我将使用路径参数方法 (/users/{id}/rents)。

通常我们会使用查询参数,以防您想要获取具有非常具体信息的列表或列表中的项目。

我推荐this article了解更多详情。

【讨论】:

  • 好的,第二个问题是我应该把这个方法放在哪里?用户控制器?然后 UserController 不仅对 User 负责,因此正如@CrazySabbath 指出的那样,它可能会令人困惑。租金控制器?当有人搜索 /api/users/1/rents 时,第一个位置可能是 UserController,因为 URI 建议这样做。
  • 我通常会引导自己寻找正确的范围。对我来说这显然是一个用户信息,基本路径是 /users/,所以我将它放在 UserController 下,因为: 1. 它是用户特定信息; 2. 基本路径引导我们在对服务进行故障排除时搜索用户范围
【解决方案2】:
/users/{id}/rents

关于我的看法,如果你使用上面的 url 并且只返回用户的列表租金,它会更清楚和容易理解。

/rents/{id}/user

将帮助跟踪该租金目前由谁使用。

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多