繁体   English   中英

Drive API 在 pageToken 返回 400 响应和 INVALID VALUE

[英]Drive API returns 400 response with INVALID VALUE at pageToken

我已经部署了一个代码来从驱动器文件夹中读取数据。 我将最后调用的 pagetoken 存储在 SQL 中并在循环中运行它以检索文件夹中所有项目的数据(> 250k)。 该循环以两种方式工作,要么从头开始并迭代调用 nextPageToken,要么使用保存在我的 sql 表中的最后一个 nextPageToken 值来运行相同的循环。

当我使用令牌而不从 SQL 调用时,它可以正常工作,直到读取所有数据,但是当使用 SQL 调用时,它会返回错误的请求错误。 在我没有通过修改的时间值过滤我的请求之前,这个过程非常有效。

def get_video_items(folder, service, token=None, begin=None, to=None):
    # EXTRACT ALL ITEMS FROM SPECIFIED FOLDER
    if not token:
        size = PAGESIZE_2
        response = service.files().list(q="'" + folder[0]['id'] + "' in parents and modifiedTime > '" + begin + "'and"
                                        "modifiedTime < '" + to + "'",
                                        orderBy='modifiedTime asc',
                                        pageSize=size, fields='nextPageToken, files(id, name, webViewLink)').execute()

    else:
        size = PAGESIZE_2
        response = service.files().list(q="'" + folder[0]['id'] + "' in parents and modifiedTime > '" + begin + "'and"
                                        "modifiedTime < '" + to + "'",
                                        orderBy='modifiedTime asc',
                                        pageSize=size, fields='nextPageToken, files(id, name, webViewLink)',
                                        pageToken=token).execute()

    videos = response.get('files', [])
    # RECORD PAGE TOKEN TO CALL NEXT PAGE
    if len(videos) < size:
        videos = None
    else:
        token = response.get('nextPageToken', None)
    return videos, token 

我收到的错误如下

引发 HttpError(resp, content, uri=self.uri) googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/drive/v3/files?q=******** ****+in+parents+and+modifiedTime+%3E+%272019-07-01T16%3A48%3A13.212522%27andmodifiedTime+%3C+%272022-07-01T10%3A38%3A13.212491%27&orderBy=modifiedTime+asc&pageSize=50&fields =nextPageToken%2C+files%28id%2C+name%2C+webViewLink%29&pageToken=~%21​​%21~AI9FV7Qu_zWbHy0zBnPqDegUffr0l2XrKvi_U_M8W17yWJ59skMILpiAR-0Oc_i-ZDxrj8Jx3AXBaMrqUh9fnrtxDcBEn4qKTHsdm4Y4_rnc6SJItgaXmOfx7HVjszfmG5z-bOHU-7flG0EIP1a2HIXq-GWFffu2ykGUaDACnteguHEjAe-tNEmPnRR1tHNmNEJACFgWnTnoCXb0w2M9kjA_VXGLwMtQ1Ar-Y9A6IJH3wQXxrIqVrIlWfJ-cEu0z6zGv3saM942Y4O0SKzLyTXk8-SWIozKH5pcFfeBTtn1z_OySgl-lHNIxRgu77lRy9wmgBhCAki8GHL0YjB_QXq7sodq7uwc9VPadokI7__0uoDCjAnvPkQ7gjH7VQWI80a1DadQ0GrZ3&alt=json returned "无效值”。 详细信息:“[{'domain': 'global', 'reason': 'invalid', 'message': 'Invalid Value', 'locationType': 'parameter', 'location': 'pageToken'}]”

有什么我做错了吗? 任何帮助将不胜感激,谢谢!

当您在这种情况下向 google 发出请求以发出file.list请求时。 Google 处理数据根据您发送的 pageSize 或他们使用默认值确定要返回的行数。

如果要返回的总行数大于 pageSize,则它们会添加一个 nextpagetoken 供您使用。 下一页的确切含义是它返回下一页数据。 不是数据的第 2 页,它是从您的请求总数返回的下一页数据。

因此,您这次发出另一个请求,包括将返回第 2 页数据的 nextpage 令牌。 如果总行数再次大于 pageSize,则将新的 nextpagetoken 添加到请求中,供您用于获取下一页。 这次是第 3 页。

您不能重复使用下一页令牌,因为它已被使用,您需要使用新的下一页令牌。 要获取第三页,谷歌假设您已经存储了第二页数据。 该令牌将不再起作用。

我不确定你为什么要费心存储这些。 下一页令牌过期,非常快,服务器毕竟不会无限期地存储您的请求。 这是一个使用它或失去它类型的东西。

  • NextPageTokens 只能使用一次
  • NextPageTokens 是短暂的。

我找到了解决方案。 就像我怀疑的那样,问题在于更改查询的结束日期。

为了解决这个问题,我添加了一个方法,在该方法中保存了一个“完成到”值,该值又在下一个查询中用于过滤日期。 至于页面令牌,它们仅在读取每个查询中的所有结果之前使用,之后保存完成时间戳并用于下一次运行的查询,并带有新的结束时间戳,这反过来又成为开始时间之后的运行。

对我来说很奇怪的是,在查询中更改结束时间,具有相同的开始时间会导致新的页面令牌系统并使旧的无用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM