我正在构建 Mash up 移动应用程序。我需要调用我的 API Provider 并与 Facebook 、 twitter 等集成。在此过程中,我必须对同一个域一个接一个地进行多个 REST API 调用(当然具有不同的路径和查询参数)。此外,API 调用必须是连续的,因为需要调用下一个。我可以通过哪些方式优化这些 http 调用以避免往返。欢迎对 java 和 js 提出建议
5 回答
规定的要求很广泛。由于您使用的是公共第三方 API,这在一定程度上限制了可能的优化范围。您绝对无法做任何事情来加速 API,因为它们不属于您。
一般来说,我建议遵循将帮助您提出更好的应用程序的指南。
- 拇指规则是尽可能少地调用 API。
- 进行更少的网络调用(由 API 调用产生)将意味着设备无线电(用于通过空中与服务器通信)将不那么频繁地使用,因此所需的功率也更少。
- 现在,拨打更少的电话可能并不总是一种选择。因此,请仔细研究公共 API 文档,并确保您了解所需 API 的所有详细信息。
- 例如,可能有一个 API,它在传递实体标识符时提供实体的详细信息。如果您需要 5 个这样的实体的详细信息,那么应该有一个 API 接受一堆 ID 并立即返回所有详细信息。这样您就可以节省多次通话。
- 缓存是减少 API 调用次数的非常有效的方法。因此,寻找从服务器接收到的任何可以缓存一段时间的数据。
- 请注意,缓存需要更多内存,因此请确保您了解其含义并相应地决定需要缓存的数据量。
- 除了内存,数据也可以缓存在磁盘上,这将有助于减少内存使用。不确定您是否使用 Android,请参阅此相关帖子。
在旁注中,您可以参考以下链接,这些链接提供了开发移动应用程序的一般指南。
请注意,这些是一般准则。有些可能不适用于您的特定用例。
如果您需要第一个 API 调用的结果来进行下一个 API 调用,那么您无法在客户端执行任何操作来避免每个 API 的顺序往返。要么需要一个现有的 API 调用,可用于将多个调用合并为一个,要么您需要将这样的 API 调用添加到服务器,或者您需要使用代理服务器来代表您执行此操作。
如果您不需要第一次 API 调用的结果来进行下一次 API 调用,但您只想按顺序处理结果,那么您可以一次进行所有 API 调用并将响应代码构造为按顺序处理它们(保存任何乱序到达的结果以供以后处理)。
REST 是统一的,因此,过滤器和往返行程对于完成特定功能是必要的。当涉及到优化和将多个客户端请求模拟到 ONE 中时,您将慢慢开始面临统一范式的挑战,因为它的客户端可能比 ONE UNIFIED 调用中的合约更具体。虽然可以对 REST 进行大量优化以将 API 调用的数量减少到两个甚至一个调用,但有时,您的客户端请求将需要复杂的过滤,这需要在应用额外的过滤逻辑之前从服务器获得反馈。
如果您的要求是您绝对必须有一个 API 调用来处理来自服务器而不是客户端的特定客户端请求,而所有过滤器都不适用,那么 RPC 将是您的选择,它将处理特定的业务逻辑从服务器到其他微服务(SOA)的宁静方式。
真正的问题是,如果您想保持 REST API 统一和一致并让客户端实现自己独特的逻辑,为什么还要让服务器来处理此类请求。REST API 服务器应为客户端提供超链接/超媒体,以指导客户端以最佳方式减少 API 调用次数,无论是通过过滤还是任何其他实体/资源。
编程级别——使用代码优化/线程/并行编程。
API 级别- 使用分页/过滤器/范围来生成适合客户需求的细粒度数据。
缓存- 在某处听说“最快的 HTTP 调用是你不做的”,即使用缓存(Memcache/Redis),大多数请求都是读取操作,明智地使用缓存控制标头也很有用。这使数据库免于服务昂贵的重复读取请求。(不确定 Etags 是否有用?)
请求/响应- 对通过 Web 传输的数据使用 JSON 序列化程序和 gZip 压缩技术。
地理- 考虑到最终用户和原始服务器之间的距离,我们可以使用 CDN 来存储响应的静态内容,以便可以真正快速地提供服务。
(听说过提高 API 性能的异步方法/反应式编程,但不太确定)
如果你可以使用 jQuery,我建议你看看我的插件jQuery Chain,它可以帮助使异步调用顺序。