2012-04-18 93 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