2012-04-18 8 views
2

で複数のリソースを取得します。複数のドキュメントIDが指定されている複数のドキュメントエントリを(1回の呼び出しで)取得する同様の方法はありますか?は同時にDocsClient.get_resource_by_id機能は、単一のIDのドキュメントエントリを取得するために存在するID

私のアプリケーションは、効率的に、私はIDを持っている複数のファイルからコンテンツをダウンロードする必要があります。適切なダウンロードURLにアクセスするためにドキュメントエントリを取得する必要があります(手動でURLを作成することもできますが、これはAPIドキュメントでは推奨されていません)。文書タイプを有することも有利であり、スプレッドシートの場合には、個々のワークシートにアクセスするために文書エントリが必要である。

全体的に私は、I/O待機を削減しようとしているので、私はドキュメントのID検索をバンドルすることができる方法があるなら、それは私にいくつかのI/Oの費用を節約します。

[編集](アランの溶液から)GDATAのV2.0にバックポートAddQuery:

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()を経由します。

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

注:バッチクエリは、現在(クライアントauth_tokenが偽装ユーザーに置き換えられ、バッチエントリのクエリのURLで管理requestor_idと「/ default」を使用しています)、ユーザーの偽装との二足歩行のOAuthでは動作しません。したがって、異なる所有者を持つアイテムを検索する場合は、この全体の運動は問題になります。 – technomage

答えて

1

あなたは、単一のHTTPリクエストを使用してAPIに複数の「GET」リクエストを送信するためにbatch requestを使用することができます。

私の回避策は、このようにilke gdata.docs.data.Resourceオブジェクトにgdata.data.BatchEntryオブジェクトを変換することです。 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

関連する問題