2

存在一个 DocsClient.get_resource_by_id 函数来获取单个 ID 的文档条目。在给定多个文档 ID 的情况下,是否有类似的方法来获取(在单个调用中)多个文档条目?

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

总的来说,我正在尝试减少 I/O 等待,所以如果有一种方法可以捆绑文档 ID 查找,它将为我节省一些 I/O 费用。

[编辑] 将 AddQuery 反向移植到 gdata v2.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.BatchEntry对象转换为类似的gdata.docs.data.Resource对象:

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

1 回答 1

1

您可以使用批处理请求通过单个 HTTP 请求向 API 发送多个“GET”请求。使用 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 回答