我想将 REST API 与 java 应用程序结合使用。 当我开始设计程序时,一切都很好,但现在我面临一个大问题:
例如,我的用户类具有 id、余额、名称等属性。 当我通过发送 POST 请求创建新用户时,不需要 id 和余额等属性。
这让我想到了一个问题:
- 我是否应该将不同的对象(如 UserCreate,仅具有创建新用户所需的属性)发布到 API 并接收完整的 User 对象?
或者
- 我是否应该向我的 User 对象添加另一个构造函数,该构造函数只需要所有必需的参数(名称)?
我相信在这种情况下,额外的构造函数可能被认为是很好的做法,但是如果发布需要一组完全不同的属性怎么办? (未包含在我的用户类中的属性)?
(另一种方法是使用 Object(),但不知怎的,这不起作用(Express 说,它是一个 http 400)。在 Retrofit2 中是否有可能在 Post 请求中发送匿名对象?)
最佳答案
首先,您的 Java 应用程序应考虑所有所需的操作,例如创建、更新、删除。这些粗略地通过 HTTP 方法 PUT
、PATCH
和 DELETE
相应地进行标识。
现在,前端发送到 Java 后端的 DTO 表示形式 (JSON/XML/REST) 在每种情况下都可以相同:CREATE、UPDATE 和 DELETE。您的后端应该为上面列出的 HTTP 方法实现上述功能。您从前端发送到后端的 DTO(可能名为 UserDTO)在所有情况下都可以相同。在此 DTO 中,您可以将所有不相关(与操作无关)的字段保留为未设置/空。
更详细:您的后端应该有接受 HTTP 方法的方法:
PUT
,其中 DTO 具有除 Id 之外的所有其他所需字段PATCH
,其中 DTO 具有 Id 字段和所有已更改字段DELETE
,其中 DTO 仅具有 Id
我不知道您使用的框架如何从您发送的 DTO 构造实际的 POJO。但现在您有了这三种方法,您实际上知道如何处理传入的 DTO,即您知道它是 CREATE、UPDATE 还是 DELETE。
因此,如果您需要自己构造 POJO,则需要 CREATE 的构造函数,对于更新很难说,也许您需要获取原始用户并逐个字段更新它,而对于删除,实际上 id 应该足以删除用户。
but what if posting would require a set of completely different attributes? (attributes that are not included in my user class)?
这似乎是一个 HTTP POST
。因此,它不是创建、更新或删除操作,而是基于某些任意操作和数据来更改状态(可能是用户)的操作。当然,对于不在 User 中的数据,您需要其他一些 DTO 来保存该数据。
关于具有多个构造函数的 Java 改造类与多个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54725081/