Java Retrofit2 POST JsonObject的良好做法?

时间:2019-02-17 16:29:41

标签: java json retrofit2

我想在我的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时是否会降低性能?

2 个答案:

答案 0 :(得分:1)

  

通常,我必须发布对象,只需要一次,所以我问自己是否真的应该添加其他类。

您的问题可能会提出基于意见的答案...但是我还是想强调一点-希望没有意见-点。首先,如果您决定构造JsonObject而不是为数据定义DTO类,那么您将完成什么工作?

我的意思是,如果您有类似的DTO:

@AllArgsConstructod
FooBarDTO {
    String foo;
    Integer age;
}

然后像这样使用它:

Call<Something> call = caller.createSomething(new FooBarDTO("bar",42));

创建该DTO类确实不花太多钱,但是会给您带来诸如:

  • 轻松
  • 键入DTO的安全实例化
  • 如果以后需要更改某些内容,则不一定需要掌握客户端和服务器端逻辑(在创建JsonObject时),您可能只需要稍微修改DTO。

因此您的UserCreateDTO中的内容已经很好地解析了。您可以节省代码的工作量和维护工作,例如:

user.setAge( jsonObject.getAsInt("age") ):

但是(好的,我承认这可能会引起意见)一种更可靠的方法:

user.setAge(dto.getAge());
  

在这种情况下,可以使用com.google.gson.JsonObject。这使我能够创建不需要其他类的Json对象。

是的,但是当服务器解析数据时,它还需要其他一些操作。然后,您将需要处理一些详细信息,例如获取属性以及在解析时间内知道它是否为int,字符串,某种数组。

答案 1 :(得分:1)

此问题仅对Retrofit2无效。我每天都与SpringJAX-RS一起工作,有时我问自己,创建所有这些简单的类(我承认有时它们会变得非常复杂)是否是个好主意。

无论如何,对此没有普遍的回应。在客户端和服务器端的API设计方面,开发人员有不同的喜好和偏好。

但是,让Java类描述请求正文响应正文格式非常有用。如果这些类遵守命名约定(例如附加*Request*Response),并且它们收集在特定的有意义的程序包中,则它们将使您的同事的生活更加轻松。 >

使用Java类意味着使您的API接口更加可靠,因为编译器将帮助您在编码时发现问题。另一方面,通过使用 untyped JsonObject(或您将使用的Json库提供的任何对象),您需要格外小心。

使用Java类,您还可以利用多态和构造模式。您可以按接口而不是具体对象进行编码。

某些将API公开给外界的服务也可能会为您提供包含预编译类的Jar文件,以使其包含在类路径中。


回答第三点,使用JsonObject手动构建Gson,而不是通过RequestBody提交,不会导致性能损失。请记住,将Java DTO用作@Body时,Gson会处理一个序列化过程。从性能的角度来看,手动构造JsonObject也可能更好。