2

単一のIDのドキュメントエントリを取得するDocsClient.get_resource_by_id関数があります。複数のドキュメントIDを指定して複数のドキュメントエントリを(1回の呼び出しで)取得する同様の方法はありますか?

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

全体として、I / O待機を削減しようとしているので、ドキュメントIDルックアップをバンドルできる方法があれば、I/O費用をいくらか節約できます。

[編集]AddQueryをgdatav2.0にバックポートする(Alainのソリューションから):

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.BatchEntrygdata.docs.data.Resource

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

1 に答える 1

1

バッチリクエストを使用すると、単一の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

プロジェクトリポジトリの最新バージョンに同期していることを確認してください。

于 2012-04-18T16:56:27.563 に答える