【问题标题】:Retrofit: Update only specific fields改造:仅更新特定字段
【发布时间】:2015-06-05 18:30:48
【问题描述】:

我一直在尝试Retrofit,我真的很简单。

但是我有一个优化问题。 我的后端使用Parse,它有一个纯Rest API。

当我想更新一个对象时,我使用 PUT HTTP Request 并只传入 body 我想要更新的特定值。

但是,使用 Retrofit 时,我总是必须在使用 @Body 注释传递整个对象时对其进行序列化。如果我有一个非常大的对象,这是非常无能的。

我看到的所有解决方案都是使用注释来通知转换器哪些字段被公开。但是,这会影响所有请求,如果我有不同的更新方法来更新不同的字段,这将不起作用。

我想我有两个选择:

  1. 将我要更新的参数作为Form参数传递并使用 @URLEncoded 注释。然而这并不是真正的RESTful 我不认为Parse 支持它。
  2. 创建注释以告知应将哪些字段添加到body 中的JSON。为此,我如何访问 Converter 中的方法注解,以便选择要序列化的字段?

【问题讨论】:

  • 你可以看看这个问题:stackoverflow.com/questions/18491733/… 和相应的答案。这会有帮助吗?
  • 有点。但是在转换器内部,我现在如何用户想要序列化哪些字段?我可以在特定的服务方法中创建一个注解,但是在 GsonConverter 中我如何访问这个注解?

标签: rest parse-platform gson retrofit


【解决方案1】:

Retrofit 默认使用 Gson。 Gson 默认排除空值。所以这应该不是问题(除非您在对象中使用原始类型)

【讨论】:

  • 这不是我想要做的。我希望能够从对象中选择要在正文请求中发送的字段。我见过的所有解决方案都是通过注释,但是这会影响具有相同对象的所有请求。
  • 如果你新建一个对象,只设置你感兴趣的字段,其他字段都为null,不被Gson序列化,不会在body中发送
  • @ffleandro 我尝试了 PUT 和 PATCH(我用于更新),在查看 charles 代理中的请求后,我可以确认只有初始化的字段正在发送
  • 我明白,但我想过滤特定的字段,而不仅仅是初始化的。例如,我想在请求中发送字段 a 和 c,而在同一端点的另一个请求中只发送 a 和 b。
  • 原始字段怎么样?如何将它们排除在身体之外?
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 2020-05-26
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
相关资源
最近更新 更多