【问题标题】:Google Drive SDK - Java sample not workingGoogle Drive SDK - Java 示例不工作
【发布时间】:2012-04-25 20:52:04
【问题描述】:

我正在尝试使用官方 Java 示例熟悉 Google Drive API。但是,在浪费了几个小时并尝试设置了两次示例之后,我仍然无法按预期使用它。

它不会显示文件的内容,而是在 FileServlet(/svc 路径)中引发 404 错误。更具体地说,service.files().get(fileId).execute(); 似乎返回 null。我已经直接从 Google Drive 以及使用 Google File Picker 尝试了不同的文件、不同的 MIME 类型。

我已尽可能严格地遵循https://developers.google.com/drive/examples/java 中描述的步骤。

有人能够让示例运行吗?

编辑: 以下是请求 URL /svc?file_id=0B08R9MrOE-ejZTY2M2I5MjAtYmVjZS00OTkyLWI4ZTEtOTg4OGM3YTIxMWEw 时 FileServlet 的日志输出(第 78 行抛出 404 错误):

2012-04-26 08:21:36.077
com.google.api.client.http.HttpRequest execute: -------------- REQUEST  --------------
GET https://www.googleapis.com/drive/v1/files/0B08R9MrOE-ejZTY2M2I5MjAtYmVjZS00OTkyLWI4ZTEtOTg4OGM3YTIxMWEw
Accept-Encoding: gzip
User-Agent: Google-HTTP-Java-Client/1.8.3-beta (gzip)

D 2012-04-26 08:21:36.263
com.google.api.client.http.HttpResponse <init>: -------------- RESPONSE --------------
403 OK
content-type: application/json; charset=UTF-8
content-encoding: gzip
date: Thu
date: 26 Apr 2012 06:21:36 GMT
expires: Thu
expires: 26 Apr 2012 06:21:36 GMT
cache-control: private
cache-control: max-age=0
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
content-length: 188
server: GSE
x-google-cache-control: remote-fetch
via: HTTP/1.1 GWA

D 2012-04-26 08:21:36.265
com.google.api.client.http.HttpResponse getContent: Response size: 188 bytes
D 2012-04-26 08:21:36.271
com.google.api.client.http.HttpResponse getContent: {
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit Exceeded. Please sign up",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit Exceeded. Please sign up"
 }
}

这听起来很像“我不认识你”,所以我再次查看了我的客户端 ID 和客户端密码:我注意到有两个客户端 ID 和客户端密码显示在API 控制台、一个“Web 应用程序的客户端 ID”和另一个“Drive SDK 的客户端 ID”。我以前用过那个用于 Web 应用程序,所以我尝试切换到用于 Drive SDK 的那个。不幸的是,这并没有改变任何东西。同样的错误...:/

【问题讨论】:

  • 您能否更改logging.properties 以记录有关 API 请求的更多详细信息并向我们显示响应正文?
  • FWIW,我编写了该示例及其指南。你能给我一个产生 404 的确切行号吗?针对 /svc 请求的 URL 是什么? GET /svc 需要 file_id 参数。
  • @VicFryzel,谢谢大家!我已经用日志输出更新了帖子。

标签: java google-drive-api


【解决方案1】:

根据您的日志,您的 404 错误似乎是由对 Drive API 的请求返回的 403 错误引起的。

来自 Google API 的错误通常在其正文中包含解释。在你的情况下:

"error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit Exceeded. Please sign up",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit Exceeded. Please sign up"
 }
}

这通常意味着您没有在您的 Google API 控制台项目上启用对 Google Drive API 的访问。为了做到这一点:

  • Google APIs Console 中打开您的项目
  • 转到服务部分
  • 通过单击开/关切换启用 Drive SDKDrive API
  • 不要忘记在 Drive SDK 部分配置您的应用,并在 **API Access" 部分配置您的 OAuth 设置

这一切都在我们文档的Get started > Register an App 部分中进行了描述。您还应该确保阅读开始的其他子部分。

【讨论】:

  • 好吧,FileServlet 会引发 404 错误,但您是对的,实际问题是 Google 会引发 403 错误。我认为该示例的说明包括所有必要的步骤,但我会看一下您建议的文档。谢谢!
  • 好的,我已经查看了建议的文档,但它们与我已经跳过的相同。在我的 API 控制台中,Drive SDK 和 Drive API 的状态为绿色,“Drive SDK”选项卡中的所有内容都已正确配置(MIME 类型、“Drive SDK 的客户端 ID”、URL、所有三个范围),该应用程序已已通过 Chrome 网上应用店安装,并且已在 client_secrets.json 中配置了“Drive SDK 的客户端 ID”。我一无所知。
  • 您实际上是否超过了每天 10,000 个查询的默认配额?
  • 您应该使用 API 访问下列出的客户端 ID 和密码。
  • @VicFryzel API 访问下列出了两个客户端 ID:“Web 应用程序的客户端 ID”和“Drive SDK 的客户端 ID”。我强烈怀疑我确实超出了我的配额。 ;) 我是唯一的用户...
【解决方案2】:

我最终设法让它工作。我不确定之前的问题是什么,但这里有一些提示给那些面临类似问题的人:

  • “Web 应用程序的客户端 ID”和“Drive SDK 的客户端 ID”让我感到困惑。不幸的是,文档没有告诉您在哪个地方使用哪一个,但您似乎只需要“Web 应用程序的客户端 ID”。

  • 如果您更新 Chrome 扩展程序或 API 控制台,驱动器可能需要一些时间才能识别这些更改。例如,在 API 控制台中更改 OAuth 客户端 ID 可能需要一些时间才能生效,因为每个人都在缓存。如果您正在测试您的应用程序,删除缓存和 cookie 有助于加快该过程。

祝你申请顺利,感谢所有帮助过我的人!

【讨论】:

    【解决方案3】:

    根据我的经验,“403 Quota Exceeded”总是源于未设置 HTPP 授权标头。

    【讨论】:

      【解决方案4】:

      我将 Google 的 dredit 示例中分发的 java OAuth 代码用于通过“打开方式”流程并同样收到 403 错误的程序。

      我必须深入研究 OAuth 代码才能找到问题所在,我没有在其他地方看到关于 403 错误的问题的根源。本质上,CredentialMediator 的 ExchangeCode 方法假定只有一个重定向 uri,这是您希望访问的那个。这对我来说不是这样,并导致了 CodeExchangeException。

      要解决此问题,您可以按摩 client_secrets 中的 uri 列表,以便您希望重定向到的 uri 是第一个或类似的,但如果此方法可以转到多个 uri 中的任何一个,则需要参数化。

      我希望这可以帮助某人根除他们的 403 gremlin。

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多