Java Retrofit2 POST JsonObject的最佳实践是什么?

3
我想在我的Java应用程序中使用REST API。我使用retrofit2进行调用。通常,我必须POST对象,但我只需要使用一次,所以我在思考是否真的需要添加一个额外的类(例如UserCreate),只是为了创建新资源(因为我经常接收到完全不同于我需要创建相同类型资源的对象)。
另一种选择是针对这种情况使用com.google.gson.JsonObject。这使我能够创建不需要额外类的Json对象。
例如:
JsonObject obj = new JsonObject();
obj.addProperty("foo", "bar");
Call<Something> call = caller.createSomething(obj);
  • 在这里使用JsonObject被认为是"好的实践"吗? 是否有比创建多个类更好的选择?

  • 我完全错了吗,创建一个单独的类是我想要做的事情的最佳方式吗?

  • 在使用JsonObject时,会失去性能吗?

2个回答

1
往往情况下,我需要POST一些只使用一次的对象,所以我在想是否真的需要添加另一个类。 你的问题可能会引起基于观点的答案……但我仍然尽力强调一些——希望没有观点倾向的——要点。首先,如果您决定构建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、string还是某些东西的数组。


1
这个问题不仅适用于Retrofit2。我每天都使用Spring和JAX-RS,有时会问自己是否创建所有这些简单的(有时它们变得相当复杂,我承认)类是一个好主意还是不好的主意。
无论如何,对此并没有通用的答案。在API设计方面,客户端和服务器端的开发人员有不同的口味和偏好。
然而,拥有描述请求体或响应体格式的Java类非常有用。如果这些类遵循命名约定(例如添加*Request或*Response),如果它们被收集在特定的、有意义的包中,它们将使你的同事随着时间的推移更容易地工作。
使用Java类意味着使您的API接口更加健壮,因为编译器将帮助您在编码时找到问题。另一方面,通过使用未经类型化的JsonObject(或您将使用的Json库提供的任何对象),您需要更加小心。
使用Java类还可以利用多态和构造模式。您可以按接口编码,而不是按具体对象编码。
某些向外界公开API的服务,还可以提供包含预编译类的Jar文件,以便将其包含在你的类路径中。
回答第三个问题,使用Gson手动构建JsonObject并通过RequestBody提交不会产生性能损失。请记住,在使用Java DTO作为@Body时,有一个由Gson处理的序列化过程。从性能角度来看,手动构建JsonObject也许更好。

1
很棒的答案,我也认为提供一个强大的系统非常重要!感谢您提到我的性能问题。 - AGuyAskingQuestions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接