使用python聚合多个API请求结果

时间:2016-01-27 05:57:08

标签: python json django api python-requests

我正在处理一个必须使用多个外部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)必须根据不同的API规范解析JSON响应。

如何有效地做到这一点?

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

2 个答案:

答案 0 :(得分:1)

这种性质的大多数API允许某种“分页”。您应该将请求编码为仅从每个提供者绘制单个页面。然后,您可以将多个页面本地合并为一个流。

如果我们假设您有3个提供商,并且页面大小固定为10,那么您将收到30个回复。假设您只向客户显示10个商家信息,则必须放弃并重新查询20个商家信息。更好的想法可能是在短时间内(例如15分钟到一小时)本地缓存查询结果,这样您每次用户在统一列表中推进页面时都不必重新查询上游提供程序。

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

答案 1 :(得分:0)

无耻的插件,但我写了一篇关于我如何在Durango REST框架here中完成此操作的帖子。

我强烈建议使用Django REST框架,它使一切变得如此简单

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

希望这有帮助!