【问题标题】:how to consume a Restful Web Service (Restful API) in Java如何在 Java 中使用 Restful Web 服务(Restful API)
【发布时间】:2016-06-23 03:39:12
【问题描述】:

我只想知道流程的高级步骤。这是我对这个过程的想法:

假设:API 返回 JSON 格式

  1. 查看 API 文档以查看返回的 JSON 的结构
  2. 创建对应的 Java 类(例如:Employee)
  3. 对端点进行 Http 调用以获取 JSON 响应
  4. 使用一些 JSON 库(例如 GSON、Jackson)将 JSON 字符串解组为 Employee 对象。
  5. 操作 Employee 对象

但是,如果 API 返回的 JSON 发生了变化怎么办?时不时检查一下JSON字符串来调整对应的Java类,真是一件繁琐的工作。

任何人都可以帮助我理解这一点。谢谢

【问题讨论】:

  • 使用 RESTful API 的方法有很多种——通常,您需要知道要使用的 API 版本。当 API 发生变化(即公开不同的版本)时,您需要确定新功能是否值得将您的应用程序迁移到最新和最好的......它总是需要一些努力来迁移到新的 API
  • @ochi 这可能是一个答案,并补充说 WHEN 有不同的 API 版本可供使用。我见过一些公司只是改变而不让旧的可用。我知道,很糟糕,但它确实发生了
  • @JorgeCampos 肯定会发生;我也见过......有兴趣让消费者开心的严肃公司知道不要这样做:) - 即使那样,他们最终可能会放弃对旧/已弃用 API 的支持(有足够的警告,与消费者沟通,当然) - 根据您的建议,将其添加为答案
  • 是的,如果没有提供 Java API,我会使用这些步骤。
  • “假设:API 返回 JSON 格式” — 当您 3.“对端点进行 Http 调用”时,您应该将 HttpHeaders.ACCEPT 设置为 MediaType.APPLICATION_JSON指定您想要 JSON 响应。

标签: java json api rest


【解决方案1】:

有很多方法可以使用 RESTful API。

通常,您需要知道要使用的 API 版本。当 API 发生变化(即公开不同的版本)时,您需要确定新功能是否值得将您的应用程序迁移到最新和最好的......

根据我的经验,迁移到新 API 总是需要付出一些努力,这实际上取决于这样做的价值(与不这样做)和/或旧 API 是否会被弃用和/或不受支持由出版商提供。

【讨论】:

  • 你好大智。您能否更具体地说明“多种方式”。对于每一种方式,你能像我一样列出步骤吗?谢谢
  • @hdang 您列出的步骤是正确的。总的来说,如果您想在 Java 中操作响应,您需要将它们映射到您的 Employee 实体。但是,想象一下,如果您的 JSON 响应是平坦的(即只有键/值对),您可能不想打扰 Employee 实体,而是使用 Map。或者,如果您的 JSON 响应主要是一组平面对象,您可以创建一个 Map 对象数组。使用 GSON(或类似的)是大多数情况下的方法
  • 还要考虑是否需要在 Java 中映射它们——如果它们只显示在 UI 中,为什么不将 JSON 响应直接传递给 UI 并让 JS 进行排序/映射 - 是的,您需要在每次 JSON 格式更改时相应地调整您的 UI/JS,但您的 Java 方面将保持不变。
  • 谢谢越智。这些解释有帮助
  • @hdang 我很高兴能帮上忙
【解决方案2】:

您描述了如何通过 http API 使用 json,这很好,因为大多数 API 就是这样。但是,如果您对使用 Restful HTTP 资源感兴趣,一种方法是:

  1. 查看 API 文档。您的客户需要支持的media-types 才能与其资源进行通信。一些 RESTafarians 认为所有media-types 都应该标准化,因此所有客户端都可能支持它们,但我认为这有点过头了。

    注意链接表示和处理逻辑。 media-types 不仅描述了数据的格式,还描述了如何处理它们。如果它是图像,如何显示它,如何运行可能是消息一部分的代码,如何在屏幕上布局,如何使用表单等嵌入式控件等。

  2. 创建相应的 Java 类。如果资源“仅”描述数据(它们通常在 API 上下文中进行),那么简单的 Java 类就可以了,否则可能需要更多。例如:表示是否可以包含在客户端上运行的 JavaScript?你需要嵌入一个 JavaScript 引擎,并准备你的类来做这件事。

  3. 如果有,请调用已添加书签的 URI。您调用的不应有硬编码的类似 SOAP 的“端点”。您从书签开始,逐步达到您的客户需要的状态

    通常,您的第一次调用会转到“开始”资源。这是您在开始时拥有的唯一书签。您在 Accept 标头中指定您支持此资源的 media-types

  4. 然后您检查返回的Content-Type 是否与您接受的media-types 之一匹配(请记住,服务器可以随意忽略您的偏好),然后您处理根据其返回的表示规则。

    例如,您想要获取客户123456 的所有帐户,但您还没有为其添加书签。您可以先GET 启动帐户管理资源。那里的处理逻辑可能会描述一个链接来访问帐户列表。你按照链接。那里的代表可能会给您一个“表格”,您必须在其中填写客户编号和POST。最后,您将获得帐户列表的表示形式。此时您可以为该页面添加书签,这样您下次就不必遍历整个链。

  5. 流程表示。这可能涉及显示、运行或只是将数据交给其他类。

抱歉,这篇文章太长了,工作一天很慢 :) 只是为了完整起见,客户需要了解的其他一些要点:缓存、处理书签(对 3xx 代码作出反应)、跟随表示中的链接。

版本控制是您提到的另一个主题。这本身就是一个完整的讨论,但简而言之:有些人(包括我自己)主张对media-type 进行版本控制。不向后兼容的更改只需更改媒体类型的名称(例如从 application/vnd.company.customer-v1+json 更改为 application/vnd.company.customer-v2+json),然后由于内容协商,所有内容(例如书签)都会继续工作。

【讨论】:

  • 感谢罗伯特。我还有一个问题。假设我有一个 Java Web 应用程序。然后我想使用 Wea​​ther.com 的 API 将天气信息集成到我的应用程序中。据我了解,我可以通过两种方式使用它:1)使用 Javascript 调用 API 并在浏览器中显示结果 2)在服务器端(我的应用程序的服务器端)调用 API,然后将结果发送到我的应用程序的客户端(即:浏览器)这是正确的吗?
  • 我不熟悉 weather.com 的 API,但我觉得这两种解决方案都可行。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多