为了账号安全,请及时绑定邮箱和手机立即绑定

REST API 部分匹配模式 - 对象具有多对多和一对多关系

REST API 部分匹配模式 - 对象具有多对多和一对多关系

天涯尽头无女友 2023-01-05 17:10:39

我有一个像这样的有点复杂的域对象:


public class User implements Serializable {


    private Long id;

    private String firstName;

    private String lastName;

    private Boolean isActive;

    private List<Company> comapnies;

    private List<Department> departments;

    private List<Responsibility> responsibilities;

    private List<ContactInformation> contactInformation;

}

我想在我的 API 中有一个端点,允许更新任何这些属性——我可以添加一个部门、一个职责、删除一个公司等。


由于网络延迟,我不想每次都进行完整的对象更新。所以我想做一个部分更新(PATCH)


现在,我有一个名为“UpdateUser”的自定义数据对象,该对象如下所示:


public class UpdateUser implements Serializable {


    private User user;

    private List<Company> comapnies_to_add;

    private List<Company> comapnies_to_remove;

    private List<Department> departments_to_add;

    private List<Department> departments_to_remove;

    private List<Responsibility> responsibilities_to_add;

    private List<Responsibility> responsibilities_to_remove;

    private List<ContactInformation> contactInformation_to_add;

    private List<ContactInformation> contactInformation_to_remove;

}

然后终点将基本上模块化这些操作中的每一个(如果 responsibilities_to_add.length > 0,处理责任的添加)。


我的问题与模式更相关——我觉得这是“hacky”。我希望有一种方法可以只对 User 对象使用部分更新,而不是使用带有自定义 UpdateUser 对象的自定义端点。有没有一种更简洁的方法来处理包括一对多关系、多对多关系等的部分更新?


我正在使用 Spring REST API 库 + Java,以防有帮助。


编辑


我想这部分也很重要——我可以轻松地将删除/添加对象的责任委托给用户中的每个集合到不同的端点(我实际上已经有了),但我想要应用程序的单一端点,所以我们可以以交易方式处理一切。


查看完整描述

2 回答

?
呼如林

TA贡献1560条经验 获得超3个赞

有没有一种更简洁的方法来处理包括一对多关系、多对多关系等的部分更新?

很难说——这取决于工作的哪一部分给你带来了麻烦。

PATCH,并且类似地PUT,表达文档编辑语义——在这两种情况下,我们都要求服务器使其对某些资源的表示与客户端的表示相匹配。

GET /foo和你依次发给我一个 1GB 的 json 文档。我将该文档加载到我的 json 编辑器中,并修复一两个拼写错误。因为变化很小,我可能想向您发送一个 PATCH 请求,而不是发回 1GB 的 json。这意味着我将在您和我理解的某种媒体类型中创建我的编辑的表示,并将该表示发送给您。

application/json-patch+json可能是一个很好的起点。

使用标准的好处在于,很多工作已经为您完成。但是您可以设计自己的补丁文档模式,如果您愿意的话,并发布它,任何理解您的模式的客户都可以与您进行互操作。

请注意,这一切都发生在“通过网络传输文档”的领域。这里没有任何事情暗示客户知道存在对象模型、关系数据库表或任何类似的实现细节。这纯粹是服务器要解决的问题。

当然,现在问题的第二部分是:我在这,一台带有补丁文档的服务器和我的关系数据库中可能需要更新的 110 个表。这是怎么发生的?正如约翰指出的那样,这是必须实施的工作。在 Java/Spring/Hibernate 类型的世界中,一个可能的答案是您可以通过 ORM 加载当前服务器端状态,使用补丁引导对本地内存数据结构的编辑,然后让您的 ORM 找出什么需要运行语句。


查看完整回答
反对 回复 2023-01-05
?
PIPIONE

TA贡献1570条经验 获得超9个赞

我以前用两种方式解决过这个问题。

  1. 就像你提到的。拥有处理逻辑和路由到适当的 crud 存储库方法的委托

  2. 使用 PATCH HTTP 方法。请注意,这只是语义上的。实际逻辑仍然需要像任何其他 HTTP 方法一样由您完成。

此处示例:https ://github.com/jersey/jersey/tree/master/examples/http-patch


查看完整回答
反对 回复 2023-01-05

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信