【问题标题】:Should I be using custom converters for Retrofit?我应该使用自定义转换器进行改造吗?
【发布时间】:2017-01-12 01:05:58
【问题描述】:

我刚刚开始学习 Retrofit 2。我需要为现有的 Android 应用使用 RESTful API。本质上,Android 应用程序的数据模型已经存在。我有一个 REST 服务,它不直接转换为应用程序使用的模型类/属性(即在内部,类属性不符合 Retrofit 自动工作所需的命名类型)。

例如,给定一个Car 对象,API 可能会返回makemodelcolor。应用程序的内部模型有一个现有的Vehicle 类,并且属性名称不直接映射。此外,某些属性必须按特定顺序初始化。

我知道这符合自定义转换器的条件,但你会建议我改为使用自定义 Gson 反序列化器吗?那会是一个更好/更容易的选择吗?

如果我刚刚开始阅读 Retrofit,任何指导都将不胜感激。我喜欢我不必编写所有样板代码的事实,但我觉得我无法充分利用它的潜力,因为我需要手动“映射”所有对象及其属性。

【问题讨论】:

  • 我想看看 Jackson 转换器。 Jackson 提供了一系列注释,例如:@JsonPropertyOrder - 排序属性,@JsonProperty("my_property") - json 属性到 POJO 映射和 @JsonIgnoreProperties - 消除您不想使用的属性等等 - 我昨天才开始使用 Jackson,并已成功使用所有这些注释并按需要工作。自定义转换器只是取消了特定库的一些样板,无论是 Gson、Jackson 等。
  • @MarkKeen 谢谢!尽管您的意思是在接近尾声时描述自定义转换器的作用,而您对使用 Jackson 的建议仍然存在?谢谢你们,因为我现在看到了改造转换器和解串器之间的区别。我读过的所有教程都建议我使用 gson。所以也许我现在需要了解杰克逊,并用它来做我所有的映射/排序和预处理。
  • 通过改造,您可以使用或不使用转换器 - 如果不使用,您仍然可以轻松地将 API 响应传递给 Gson/Jackson 等,改造通过转换器提供了便利。我已经将 Gson 转换器与 Retrofit2 一起使用,我也单独使用了 Gson。我已经开始使用 Jackson,并且已经更喜欢它了。我所看到的所有迹象都表明它明显更快(不确定 Gson 是否使用反射,老实说 Jackson 没有,但性能更好)。
  • @MarkKeen 看来我实际上可以直接使用 Jackson 来解析 Http 请求 - 还是我还需要使用 Retrofit?不管怎样,有什么好的教程可以指点我吗?杰克逊自己网站上的东西令人生畏和可怕:)
  • 您可以使用 Jackson 直接进行转换 .. Retrofit 将其抽象出来,无论如何它都使用 okhttp,因此您可以将 okhttp 与 Jackson 单独结合使用..

标签: android rest retrofit2


【解决方案1】:

您需要考虑几件事情:

1) 你的 API 响应是否保持相同(即使缺少属性)格式

然后:

1.1) 您可以制作自定义转换器或反序列化器

1.2) 修改和同步您的内部 Android 模型以表示您收到的模型,反之亦然,就好像您的 Android 模型不同,它可能涉及每个响应的大量计算

否则:

2)如果您的 API 响应采用不同的格式并且它确实是 RESTful API,那么您应该通过某种方式在响应的标头或正文中获取媒体类型的信息,然后您可以根据此信息进行选择适当的转换器/解串器。 这更像是自定义转换器,它根据实际响应委托给另一个转换器。

对于这两种情况,您都可以在从 Retrofit 获得响应后应用某种中间转换器/映射器,这可能是最简单的,但每次收到响应时它都会消耗 CPU 和内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多