Google Drive SDK - Java示例无效

时间:2012-04-25 20:52:05

标签: java google-drive-api

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

而不是显示文件的内容,它会在FileServlet(/ svc路径)中抛出404错误。更具体地说,service.files().get(fileId).execute();似乎返回null。我已尝试使用不同的文件,不同的MIME类型,直接来自Google云端硬盘以及使用Google文件选择器。

我尽可能地遵循了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的那个。不幸的是,这并没有改变任何事情。同样的错误......:/

3 个答案:

答案 0 :(得分:7)

根据您的日志,您的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
  • 中打开您的项目
  • 转到服务部分
  • 点击开/关切换
  • 启用云端硬盘SDK 云端硬盘
  • 不要忘记在 Drive SDK 部分配置您的应用,并在** API访问权限部分
  • 中配置您的OAuth设置

我们的文档的Get started > Register an App部分对此进行了描述。您还应确保通过使用入门的其他子部分。

答案 1 :(得分:1)

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

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

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

祝你的应用程序好运,感谢所有帮助我的人!

答案 2 :(得分:1)

我使用了Google的dredit示例中分发的java OAuth代码,用于执行“打开方式”流程的程序,同样收到了403错误。

我不得不深入研究OAuth代码以找到问题,其中我在其他地方没有提到403错误的来源。基本上,CredentialMediator的ExchangeCode方法假设只有一个重定向uri,这是您希望转到的那个。对我来说情况并非如此,并导致CodeExchangeException。

要解决这个问题,你可以按下client_secrets中的uris列表,这样你想要重定向到的uri是第一个或者其他类似的,但是如果这个方法可以转到uris中的任何一个,那么它将需要参数化。

我希望这有助于某人根除他们的403 gremlin。