我想在我的Java应用程序中使用REST API。对于我的电话,我使用Retrofit2。通常,我必须发布对象,只需要一次,所以我问自己是否真的应该添加其他类。
(例如UserCreate)仅用于创建新资源(因为通常我收到的对象与创建相同类型资源所需的对象完全不同)
在这种情况下,可以使用com.google.gson.JsonObject
。这使我能够创建不需要其他类的Json对象。
例如:
JsonObject obj = new JsonObject();
obj.addProperty("foo", "bar");
Call<Something> call = caller.createSomething(obj);
在这里使用JsonObject被认为是“良好实践”吗?是否有比创建多个类更好的选择?
我完全错了吗,创建一个单独的类是做我想做的最好的方法吗?
使用JsonObject时是否会降低性能?
答案 0 :(得分:1)
通常,我必须发布对象,只需要一次,所以我问自己是否真的应该添加其他类。
您的问题可能会提出基于意见的答案...但是我还是想强调一点-希望没有意见-点。首先,如果您决定构造JsonObject
而不是为数据定义DTO类,那么您将完成什么工作?
我的意思是,如果您有类似的DTO:
@AllArgsConstructod
FooBarDTO {
String foo;
Integer age;
}
然后像这样使用它:
Call<Something> call = caller.createSomething(new FooBarDTO("bar",42));
创建该DTO类确实不花太多钱,但是会给您带来诸如:
JsonObject
时),您可能只需要稍微修改DTO。因此您的UserCreateDTO
中的内容已经很好地解析了。您可以节省代码的工作量和维护工作,例如:
user.setAge( jsonObject.getAsInt("age") ):
但是(好的,我承认这可能会引起意见)一种更可靠的方法:
user.setAge(dto.getAge());
在这种情况下,可以使用com.google.gson.JsonObject。这使我能够创建不需要其他类的Json对象。
是的,但是当服务器解析数据时,它还需要其他一些操作。然后,您将需要处理一些详细信息,例如获取属性以及在解析时间内知道它是否为int,字符串,某种数组。
答案 1 :(得分:1)
此问题仅对Retrofit2
无效。我每天都与Spring
和JAX-RS
一起工作,有时我问自己,创建所有这些简单的类(我承认有时它们会变得非常复杂)是否是个好主意。
无论如何,对此没有普遍的回应。在客户端和服务器端的API设计方面,开发人员有不同的喜好和偏好。
但是,让Java类描述请求正文或响应正文格式非常有用。如果这些类遵守命名约定(例如附加*Request
或*Response
),并且它们收集在特定的有意义的程序包中,则它们将使您的同事的生活更加轻松。 >
使用Java类意味着使您的API接口更加可靠,因为编译器将帮助您在编码时发现问题。另一方面,通过使用 untyped JsonObject
(或您将使用的Json库提供的任何对象),您需要格外小心。
使用Java类,您还可以利用多态和构造模式。您可以按接口而不是具体对象进行编码。
某些将API公开给外界的服务也可能会为您提供包含预编译类的Jar文件,以使其包含在类路径中。
回答第三点,使用JsonObject
手动构建Gson
,而不是通过RequestBody
提交,不会导致性能损失。请记住,将Java DTO
用作@Body
时,Gson
会处理一个序列化过程。从性能的角度来看,手动构造JsonObject
也可能更好。