【问题标题】:Internal Server Error 500 on files().list() with Drive REST API带有 Drive REST API 的 files().list() 上的内部服务器错误 500
【发布时间】:2022-03-28 16:04:32
【问题描述】:

更新:此问题似乎已解决。详情请见bug tracker report。


我在通过 Drive REST API (v3) 完成文件列表请求时遇到了一些困难,但没有 内部服务器错误(错误代码 500。)我正在尝试使用 name 和 appProperties 键调用 files().list() 在搜索条件中,name 和 createdTime 用于排序顺序。 (这是“案例 1”中的 下面的代码。)我使用的语法记录在here。

为了隔离问题,我采用了 Google Drive API > REST Android 快速入门项目 找到here 并对 getDataFromApi 方法如下面的代码块所示。

有六个测试用例使用搜索条件和排序字段的各种组合。一些查询成功,而 其他人因服务器代码 500 而失败并且一次超时。这些结果在运行 Android 7.0 的模拟器上是一致的 使用 API 24。我的问题源于早期版本。

我最感兴趣的是获得案例 1 的解决方案,并提供其他案例作为我试图找出问题所在的尝试。对于我可能做错了什么或可能发生的其他事情,我将不胜感激。

         private List<String> getDataFromApi() throws IOException {
            // Get a list of up to 10 files.
            List<String> fileInfo = new ArrayList<String>();

/*          Case 1: Crashes with following error:
             500 Internal Server Error
             {
              "code" : 500,
              "errors" : [ {
              "domain" : "global",
              "message" : "Internal Error",
              "reason" : "internalError"
             }],
              "message" : "Internal Error"
             } */
            String query = "name contains 'Test' and not appProperties has {key='X' and value='Y'}";
            String orderBy = "name, createdTime";

//            Case 2: Succeeds and lists files.
//            Like case 1, but "createdTime is dropped in sort order.
//            String query = "name contains 'Test' and not appProperties has {key='X' and value='Y'}";
//            String orderBy = "name";

//            Case 3: Succeeds and lists files.
//            Like case 1, but appProperties criteria is dropped.
//            String query = "name contains 'Test'";
//            String orderBy = "name, createdTime";

//            Case 4: Times out.
//            Like case 1, but the name criteria is dropped.
//            String query = "not appProperties has {key='X' and value='Y'}";
//            String orderBy = "name, createdTime";

//            Case 5: Errors out like case 1.
//            Like case 4, but the selection query is inverted.
//            String query = "appProperties has {key='X' and value='Y'}";
//            String orderBy = "name, createdTime";

//            Case 6: Succeeds and lists files.
//            Like case 4, but name is dropped in sort order.
//            final String query = "not appProperties has {key='X' and value='Y'}";
//            final String orderBy = "createdTime";

            FileList result = mService.files().list()
                    .setPageSize(10)
                    .setFields("nextPageToken, files(id, name)")
                    // following was added
                    .setOrderBy(orderBy)
                    .setQ(query)
                    // end added code
                    .execute();
            List<File> files = result.getFiles();
            if (files != null) {
                for (File file : files) {
                    fileInfo.add(String.format("%s (%s)\n",
                            file.getName(), file.getId()));
                }
            }
            return fileInfo;
        }

【问题讨论】:

  • 请检查我的问题的编辑,我很抱歉,有时它不是标准答案。
  • 简单的答案往往是最好的答案。非常感谢您抽出宝贵时间做出回应并进行一些自己的调查。
  • 你对另一个问题的评论引起了我的兴趣,我去玩它。我一直在寻找谷歌的错误,没有多少人发现合法的错误,这是一项成就。 :)
  • 幸运我.....;)

标签: google-drive-api


【解决方案1】:

答案的主要编辑:

我认为您应该将此作为错误报告给 Google。我一直在玩它,但我无法让appProperties 作为file.list 的一部分返回,就像文件资源不包含该字段一样,因此您从search 收到错误消息。即使我将字段设置为 * 也是如此,这应该返回文件 resource 的所有字段。

当您报告它时,请将您的示例发送给他们apps-api-issues 链接此问题。将您的问题请求链接回此处,我会看看是否可以在 Google 云端硬盘上找到某人来 ping 一下。

【讨论】:

  • 感谢您的详细回复。我知道指数退避的概念,但我不相信它解决了我的问题。我的测试用例总是失败并且永远不会成功。如果问题是暂时的,我希望至少偶尔会成功。我使用的 QuickStart 应用程序向用户提供了一个按需要执行 file().list() 请求的按钮。如果我以不同的延迟按下该按钮一次、两次或十次,结果总是相同的,永远不会改变。这让我相信这个问题不是指数退避可以解决的暂时性问题。
  • 如果您收到 500 错误,如果您再试一次,它会起作用吗?您只需要实现指数退避。您还没有显示您的代码,因此很难帮助您调试问题。
  • 如果我得到 500 错误,如果我再试一次(或一次又一次)它就不起作用。测试用例每次都以我记录的方式失败。至于发布我的代码,我正在使用 QuickStart 程序(只有 mods 到 getDataFromApi 方法)来隔离和演示问题。 QuickStart 程序(修改后的)准确地反映了我遇到的问题,并且(我希望)确保遵循最佳实践,这样我们就不会因为我的特定代码而陷入困境。另请参阅我对@pinoyyid 的回复。
  • 我宁愿这是我的代码中的一个错字,但我会按照您建议的适当链接等将其作为缺陷提交给 Google。这可能会在今天晚些时候发生。
  • 当你这样做时告诉我,我会转发。请注意,这不是我在 v3 中看到的第一个错误,它仍然很新
【解决方案2】:

指数退避仅适用于暂时性错误。这只是偶尔发生,例如。当发生数据中心中断时。

许多 500 错误是 GDrive 中的错误,其中无效(或偶尔,甚至 有效)请求被错误地处理。我建议您使用https://developers.google.com/drive/v3/reference/files/list#try-it 来确保您的查询字符串格式正确、引用正确等。

【讨论】:

  • 感谢您提出这个想法。我已经使用 Web 界面测试了每个测试用例,每个用例都失败、成功或超时,就像它在原始问题中发布的测试代码中所做的那样。当然,如果查询在代码中的格式不正确,我只会将问题复制到 Web 界面,所以我不确定这个新测试表明什么或从那里去哪里。
  • 我也注意到只有在查询字符串中引用了appProperties并且有两个排序字段时才会出现故障。如果仅使用一个排序字段(相同的 setQ ,不同的 setOrderBy),则出错的相同查询会成功。我认为这表明 setQ 字符串是正确的。对于@DaImTo 提出的问题:成功时总是成功,失败时总是失败。此行为在修改后的 QuickStart 应用程序和 Web 界面中是相同的。
  • 我怀疑可能是这种情况。因为返回 500 需要一段时间,所以我怀疑这是基于查询在幕后生成的工作量的内部超时。如果是这样,不要指望快速修复。我的建议是修改您的应用程序以使用单个排序字段运行,然后将结果发布到所需的顺序。
  • 可能是这样,但我认为可以在 0.65 秒内对我输入的任何查询返回 560,867 个响应的 Google 可以查看我的少量文件并告诉我在合理数量的范围内是什么时间。我怀疑这是他们可以快速修复的普通缺陷。同时,我将利用您建议的解决方法。
  • 您会这么认为,但 Google 云端硬盘基础架构远比您想象的要复杂得多。我使用 v2 和 v3 API 尝试了您的查询,并得到了相同的结果。这表明问题出在基础设施层,而不是 API 层。您只有少量文件这一事实使我建议的解决方法更易于实施,因此我会继续采用这种方式,如果您的错误得到修复,您可以将其视为一个不错的奖励。
猜你喜欢
  • 2016-01-10
  • 2019-12-09
  • 2018-09-30
  • 1970-01-01
  • 2018-07-08
  • 2022-11-26
  • 2020-07-26
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多