RESTAPI输入模型过于通用
我有一个典型的SpringBootRESTAPI来对用户对象执行crud操作RESTAPI输入模型过于通用,rest,api-design,Rest,Api Design,我有一个典型的SpringBootRESTAPI来对用户对象执行crud操作 Class User{ long id String displayName String email String passwordHash String passwordSalt Instant passwordExpiryDate boolean locked Instant version (sql timestamp for optimistic
Class User{
long id
String displayName
String email
String passwordHash
String passwordSalt
Instant passwordExpiryDate
boolean locked
Instant version (sql timestamp for optimistic locking)
}
:创建用户发布用户/
:获取用户详细信息获取用户/{id}
:更新用户名和电子邮件PUT users/{id}
:更新用户密码PUT users/{id}/password
:将锁定状态设置为falsePUT users/{id}/unlock
:删除用户/{id}
:您不需要提供id、密码、salt/hash或版本,它们是生成的POST users/
:无需返回id,请求者已经知道了GET users/{id}
:只需要新的电子邮件、名称和版本PUT users/{id}
:只需要新密码和版本PUT users/{id}/password
:只需要版本PUT users/{id}/unlock
- 新用户详细信息
- 无ID用户
- UserWithOnlyPassword
- UserWithOnlyPersonalDetails
- 用户版本
对于api的客户端和内部结构来说,似乎没有一个解决方案是干净的。这种API设计的最佳实践是什么?我认为为每个操作创建不同的类是错误的,因为业务逻辑围绕同一实体运行。对所有操作使用相同的对象本身(域对象模型)。您可以基于这些类创建不同的验证。我强烈建议您为Web API创建模型,而不是公开域(或持久性)模型,这样您就可以对API生成和使用的数据进行细粒度控制 域(或持久性)模型是复杂的,通常包含您不想(或不能)公开的关系和属性。随着时间的推移,字段可能会被添加到您的域模型、删除、重命名、修改等等。 如果您公开这样的模型,您可能会发现在不破坏客户机的情况下,很难协调多个版本的API 通过引入映射框架,您当然可以减少将API模型映射到域模型的样板代码 验证应该在服务层的域模型上执行。但是,没有什么可以阻止您在控制器层对Web API模型执行某种级别的验证
相关:本文讨论了一个类似的主题。验证在类内部,使用javax,因此不起作用。例如,对于updatepassword,密码是必需的,但是对于unlock,密码实际上应该为null。这就是为什么我不想只使用一个类。大多数企业应用程序都使用域对象模型,因为它们不想在最后把不同的类搞得一团糟。在您的情况下,只需不传递可选字段并相应地进行验证。