【问题标题】:Aggregate multiple APIs request results using python使用 python 聚合多个 API 请求结果
【发布时间】:2016-01-27 05:57:08
【问题描述】:

我正在开发一个应用程序,该应用程序必须使用多个外部 API 获取信息,并在处理数据后将结果输出到客户端。客户端使用 Web 界面进行查询,一旦查询发送到服务器,服务器进程将请求发送到不同的 API 提供者,并在加入来自这些 API 的响应后,将响应返回给客户端。

所有响应均采用 JSON 格式。

目前的做法:

import requests
def get_results(city, country, query, type, position):
    #get list of apis with authentication code for this query 
    apis = get_list_of_apis(type, position) 
    results = [ ]
    for api in apis:
        result = requests.get(api)
        #parse json 
        #combine result in uniform format to display 
    return results

服务器使用 Django 生成响应。
这种方法的问题
(i) 这可能会产生大量数据,即使客户对所有数据都不感兴趣。
(ii) JSON 响应必须根据不同的 API 规范进行解析。

如何有效地做到这一点?

注意:正在进行查询以提供职位列表。

【问题讨论】:

标签: python json django api python-requests


【解决方案1】:

大多数这种性质的 API 都允许某种“分页”。您应该对您的请求进行编码,以便仅从每个提供者那里绘制一个页面。然后,您可以在本地将多个页面合并到一个流中。

如果我们假设您有 3 个提供者,并且页面大小固定为 10,那么您将收到 30 个响应。假设您只向客户显示 10 个列表,您将不得不丢弃并重新查询 20 个列表。一个更好的主意可能是将查询结果在本地缓存一小段时间(比如 15 分钟到一个小时),这样您就不必在每次用户在合并列表中前进页面时重新查询上游提供程序。

就不同提供程序所需的不同解析而言,您必须在内部进行处理。为每个创建不同的类。提供者列表是固定的,而且很小,因此您可以编写一个表格,其中提供者 URL 获取哪个类行为。

【讨论】:

  • 你是对的,但它增加了创建太多类来解析数据的开销。
【解决方案2】:

无耻的插件,但我写了一篇关于我是如何在杜兰戈 REST 框架 here 中做到这一点的帖子。

我强烈推荐使用 Django REST 框架,它让一切变得如此简单

基本上,您的 API 端的模型非常简单,只包含有关使用哪些外部 API 以及该 API 资源的 ID 的信息。然后,GenericProvider 类提供一个抽象接口来对外部源执行 CRUD 操作。此 GenericProvider 使用您创建的其他提供程序,并通过模型上的提供程序字段确定要使用的提供程序。然后,GenericProvider 返回的所有数据都会像往常一样被序列化。

希望这会有所帮助!

【讨论】:

  • 不错,奥斯汀写的方法差不多。但这里的问题是大多数 REST API 提供者不提供库来完成大部分工作,因此在这种情况下,唯一的方法是解析检索到的 JSON 并将结果发送回客户端。
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 2021-05-01
  • 2012-04-18
  • 2020-08-20
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多