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库似乎解决了这个问题。
但是,如果有人仍然需要解决它,或者正在使用不同的环境(如 ios 或 android),那就是解决方案。
似乎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 sheet api 会引发错误 localhost 当前无法处理此请求。 HTTP 错误 500