【问题标题】:How to return JSON in HTTP client library?如何在 HTTP 客户端库中返回 JSON?
【发布时间】:2017-06-24 13:37:00
【问题描述】:

我想创建一个库来执行身份验证工作(在请求中发送一些身份验证参数)并从 API 返回 json 响应。 JSON 通常表示一个字典数组,如下所示:

[
  {"a": 1, "b": 2},
  {"a": 3, "b": 1}
]

我在Python 中做了同样的事情,这很简单,我只返回一个dict,它内置在Python 中。

我想知道Java 的最佳方式是什么?以下是我考虑的一些方法:

  1. 返回将由用户处理的流。具体来说,我使用java.net.HttpURLConnection,通过这种方法我将返回connection.getInputStream(),这将由用户处理。这种方法的缺点是用户需要完成大部分工作(读取流并将其转换为类似 json 的对象或其他)。好的部分是用户可以灵活地以他们喜欢的任何方式处理它,从类创建自定义对象,使用第三方 json 库或其他东西。通过这种方法,我不会强迫他们使用某些库,因为整个代码将使用 Java 内置功能。
  2. 使用第三方库,如org.jsonGSON 并返回那种对象。这里的缺点是我会强制用户使用第三方库。
  3. 我可以为每种对象定义类,大概有 5-6 种类型。缺点是:我需要更多时间来实施解决方案,并且会强制用户使用我的对象。

困扰我的是 Python 开发人员经常使用 dict,而在 Java 中,开发人员通常更喜欢使用特定用户定义类的对象。所以,我无法得出最合适的方法。

【问题讨论】:

标签: java json rest http


【解决方案1】:

HTTP API 的任何端点都具有定义的响应结构(或至少应该如此)。您的库实现的方法应返回表示响应负载的 POJO。最终用户不需要知道 API 会以 JSON 格式格式化负载。如果有一天 API 决定使用 XML,那么该更改对您的库的用户应该是透明的。

编辑:简单地返回字典或地图类型是不好的做法。这样做会强制库的用户在响应中假设每个属性的键字符串和值类型。 POJO 提供了响应属性名称及其值类型的清晰定义。

【讨论】:

  • 因此,在我的示例中,我应该返回如下内容:List<MyEntity> 其中MyEntity 是具有属性ab 的POJO 类?
  • @giliev 完全正确
  • 好的,在我的场景中这似乎是可行的,因为没有太多不同的 POJO 类(少于 10 个),但是如果有 100 个可能的 POJO 呢?我的意思是它仍然可行,但我想知道是否有某种方法可以提供良好的用户体验,但仍然让我用更少的代码完成工作。
  • 谢谢你的回答,现在我看到了编辑,这是一个好点。不过,我还是想听听您对我在之前评论中的言论有何看法。
  • @giliev 如果 API 太大以至于它可以为超过 100 种不同类型提供响应,那么可能需要将它分成更小的 API。但是,如果需要 100 个,那么是的,您的库将需要一个 POJO。这在 OOP 中很常见。但是,API 应该为业务领域对象提供响应。如果你有超过 100 个,那么你还有一些工作要做。
猜你喜欢
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多