Google API 批处理请求为通过 Python 客户端的每次调用返回 HttpError 404

Posted

技术标签:

【中文标题】Google API 批处理请求为通过 Python 客户端的每次调用返回 HttpError 404【英文标题】:Google API batch request returns HttpError 404 for every call through Python client 【发布时间】:2018-01-01 20:30:46 【问题描述】:

我有一个基于 google-api-python-client 的小应用程序,但是批处理请求已经有几天没有工作了(错误 404)。

例如,以下代码直到几天前都可以正常工作。

from apiclient.http import BatchHttpRequest
from apiclient.discovery import build
import json

DEVELOPER_KEY = "foobar"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

channelIds = ['UC2C_jShtL725hvbm1arSV9w','UC2C_jShtL725hvbm1arSV9w']

parts_list = [
"id",
"brandingSettings",
]

fields_list = [
"items/id",
"items/brandingSettings/channel",    
]

parts = ",".join(parts_list)
fields = ",".join(fields_list)

request_map = 

def this_is_the_callback_function(request_id, response, exception):
  if exception is not None:
    # Do something with the exception
    print exception
    pass
  else:
    print request_id
    print request_map[int(request_id)]
    print json.dumps(response,sort_keys=True, indent=4)

service = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)
batch = service.new_batch_http_request(callback=this_is_the_callback_function)

channels = service.channels()
i = 0
for c in channelIds:
    i += 1
    request_map[i] = c
    request = channels.list(id=c,part=parts, fields=fields)
    batch.add(request)
print request_map
batch.execute()

现在,如果我运行它,我会得到:

1: 'UC2C_jShtL725hvbm1arSV9w', 2: 'UC2C_jShtL725hvbm1arSV9w'
<HttpError 404 when requesting https://www.googleapis.com/youtube/v3/channels?fields=items%2Fid%2Citems%2FbrandingSettings%2Fchannel&alt=json&part=id%2CbrandingSettings&id=UC2C_jShtL725hvbm1arSV9w&key=foobar returned "Not Found">
<HttpError 404 when requesting https://www.googleapis.com/youtube/v3/channels?fields=items%2Fid%2Citems%2FbrandingSettings%2Fchannel&alt=json&part=id%2CbrandingSettings&id=UC2C_jShtL725hvbm1arSV9w&key=foobar returned "Not Found">

奇怪。对我来说奇怪的是,如果我尝试对这些链接发出简单的请求(只需在浏览器中剪切和粘贴 URL),服务器就会像往常一样返回数据。

【问题讨论】:

您是否得到了答案或找到了解决方法?我遇到了完全相同的问题。 你好@spuriousdata。没有答案,目前没有解决方法:(你知道为什么会这样吗? 我不知道,但我已经联系了谷歌,他们似乎正在修复它。 我在使用 javascript gapi 客户端时也遇到了这个问题。如果没有批处理,请求可以正常工作,但在批处理时会中断。有人有答案吗? 如果不完全重写我的逻辑,恐怕我无法通过请求执行批量请求。我确实使用官方的 Google Python 客户端在更高的抽象级别上工作(可能它完全利用了请求或引擎盖下的类似库)。我不明白为什么它不再工作了。 【参考方案1】:

最新版本的python库似乎解决了这个问题。

但是,如果有人仍然需要解决它,或者正在使用不同的环境(如 iosandroid),那就是解决方案。

似乎google之前使用过一个批处理url,它是:

https://www.googleapis.com/batch

这在我的应用程序中运行良好,直到它突然停止。似乎解决方案是将批量调用的 url 更改为:

https://www.googleapis.com/batch/youtube/v3 (对于 youtube api)

通常 google api 对象会公开一个允许更改此值的属性,但如果不是,则可以在源代码中更改。

【讨论】:

我相信问题已经在服务器端解决了。这不是 Python 库的问题。

以上是关于Google API 批处理请求为通过 Python 客户端的每次调用返回 HttpError 404的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Apps 脚本中使用 UrlFetchApp 发出 Drive API 批处理请求

Google Batch API,多个授权标头

调用 google sheet api 会引发错误 localhost 当前无法处理此请求。 HTTP 错误 500

使用 Google Apps 脚本的 Facebook API 批处理请求

我如何通过带有请求的Express传递请求API响应?

Google Calendar API 批量请求 PHP