2012-04-18 62 views
2

存在一个DocsClient.get_resource_by_id函数来获取单个ID的文档录入同时得到多个资源。在给定多个文档ID的情况下,是否有类似的方式来获取(在单个调用中)多个文档条目?通过ID

我的应用程序需要有效地下载从我有ID的多个文件的内容。我需要获取文档条目以访问相应的下载URL(我可以手动构建URL,但API文档中不鼓励这样做)。这也是有利的文档类型,并且在电子数据表的情况下,文档项,以便访问单个工作表所需的。

总的来说,我试图减少I/O等待,因此,如果有一种方法,我可以捆绑文档ID查找,它会救我一些I/O开销。

[编辑]向后移植的AddQuery到GDATA V2.0(从阿兰的溶液):

client = DocsClient() 
# ... 
request_feed = gdata.data.BatchFeed() 
request_entry = gdata.data.BatchEntry() 
request_entry.batch_id = gdata.data.BatchId(text=resource_id) 
request_entry.batch_operation = gdata.data.BATCH_QUERY 
request_feed.add_batch_entry(entry=request_entry, batch_id_string=resource_id, operation_string=gdata.data.BATCH_QUERY) 
batch_url = gdata.docs.client.RESOURCE_FEED_URI + '/batch' 
rsp = client.batch(request_feed, batch_url) 

rsp.entry是BatchEntry对象,这似乎指向正确的资源的集合,但是其从不同的条目我通常会通过client.get_resource_by_id()获得。

我的解决方法是gdata.data.BatchEntry对象转换为gdata.docs.data.Resource对象ILKE这样的:

entry = atom.core.parse(entry.to_string(), gdata.docs.data.Resource) 
+0

注:批量查询,目前不与用户模拟(其中,客户端的auth_token使用在批量录入查询网址管理员requestor_id和“/默认”是由模拟用户更换)双向OAuth工作。因此,如果您打算查找不同所有者的项目,则整个练习都没有实际意义。 – technomage 2012-04-27 15:26:19

回答

1

可以使用batch request发送使用一个HTTP请求的多个“GET”请求的API。 使用Python客户端库,您可以使用此代码段来实现这一目标:

def retrieve_resources(gd_client, ids): 
    """Retrieve Documents List API Resources using a batch request. 

    Args: 
    gd_client: authorized gdata.docs.client.DocsClient instance. 
    ids: Collection of resource id to retrieve. 

    Returns: 
    ResourceFeed containing the retrieved resources. 
    """ 
    # Feed that holds the batch request entries. 
    request_feed = gdata.docs.data.ResourceFeed() 

    for resource_id in ids: 
    # Entry that holds the batch request. 
    request_entry = gdata.docs.data.Resource() 
    self_link = gdata.docs.client.RESOURCE_SELF_LINK_TEMPLATE % resource_id 
    request_entry.id = atom.data.Id(text=self_link) 
    # Add the request entry to the batch feed. 
    request_feed.AddQuery(entry=request_entry, batch_id_string=resource_id) 

    # Submit the batch request to the server. 
    batch_url = gdata.docs.client.RESOURCE_FEED_URI + '/batch' 
    response_feed = gd_client.Post(request_feed, batch_url) 

    # Check the batch request's status. 
    for entry in response_feed.entry: 
    print '%s: %s (%s)' % (entry.batch_id.text, 
          entry.batch_status.code, 
          entry.batch_status.reason) 
    return response_feed 

确保同步到project repository的最新版本。

+0

我可以被限制为GDATA 2.0.x的系列,至少暂时。是否有2.0兼容的等价物(现在查看python-2.0客户端库文档...)? – technomage 2012-04-19 13:13:18