【问题标题】:How can I create a HTTP/Rest request to upload something to Google Drive如何创建 HTTP/Rest 请求以将内容上传到 Google Drive
【发布时间】:2015-08-29 17:06:44
【问题描述】:

我想创建一个命令行工具来下载文件并将其上传到我的 Google Drive。我不想使用 Google 已经提供 api 调用的任何语言(Java、php、javascript、C# 等)。

我将使用 Haskell,但这与问题无关。

我现在要做的是形成一个上传文件的 POST 请求。我现在的要求是这样的:

POST /upload/drive/v2/files?uploadType=media HTTP/1.1
Host: www.googleapis.com
Content-Type: */*
Content-Length: 5
Authorization: Bearer AIzaSy......jH683-FRO9GI
Cache-Control: no-cache

test1 

我得到了这样的回应:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "authError",
                "message": "Invalid Credentials",
                "locationType": "header",
                "location": "Authorization"
            }
        ],
        "code": 401,
        "message": "Invalid Credentials"
    }
}

Authorization: 旁边,我放置了我从 Google 开发者控制台创建的 API 密钥。

我想我必须做不止一个请求才能完成这项工作。首先,我必须获取一个授权码,然后使用该代码获取一个授权令牌,然后将该令牌用于我的发布请求。

我怎样才能做到这一点?谁能给我一个简短的例子?

【问题讨论】:

  • 没有短示例,只有长示例,它们在 Google 文档中。在尝试与云端硬盘对话之前,您需要了解并实施 OAuth
  • @pinoyyid 在谷歌文档中,我发现仅适用于 Java、C#、Javascript 等的示例...
  • 搜索 Google Oauth,你会看到其余 api 的片段。例如 https://developers.google.com/identity/protocols/OAuth2WebServer?hl=en。请记住,在您知道足够的 OAuth 以获取访问令牌之前,请勿靠近 Google Drive。

标签: rest google-drive-api google-oauth


【解决方案1】:

有几个可能的问题:

#1

您不应在请求中发送 API 密钥。

#2

您的密钥可能已过期。它们只持续 60 分钟。

#3

您的访问权限可能已被撤销。 (但在您的情况下,如果您能够获得访问令牌,那么情况并非如此)

#4

您的请求中没有包含访问令牌。


我认为您的问题是 #1 或 #4 的结果,但我列出了其他可能性以供参考。


编辑#1:

为了解决该评论,我将解释 Google 用于验证请求的过程。 This 问题解决了一些过程,但我将在这个问题的上下文中重写其中的一些。 (链接的问题是我问的,后来我回答了)

向 Google API 发出请求需要两个主要项目:

  1. refresh_token - 用于获得更多 access_tokens 并且永不过期
  2. access_token - 用于发送 API 调用(例如:上传文件),每 60 分钟过期一次。

为了获得其中任何一个,您必须遵循某些步骤。

  1. 通过 Google Developers Console 获取 OAuth 2.0 客户端 ID

  2. 从 Google 授权服务器获取访问令牌

  3. 将访问令牌发送到 API

  4. 如有必要,请刷新访问令牌

关于这个“一般”流程的更多具体信息可以在here找到。

棘手的步骤是获取刷新令牌,因为一旦您将其存储在安全位置,您就可以使用简单的 httpRequest 执行任何操作。

要获得刷新令牌,用户必须同意授予您的项目访问某些功能的权限。这在 Google 语言中称为 scopes。您可以通过多种不同的方式来做到这一点(根据 Google):

有几种方法可以提出这个请求,它们会根据具体情况而有所不同 您正在构建的应用程序类型。例如,一个 JavaScript 应用程序可能会使用浏览器重定向请求访问令牌 谷歌,而安装在没有浏览器的设备上的应用程序 使用网络服务请求。

他们没有告诉你的一件事是,在你的情况下,你使用什么媒介来获取refresh_token 并不重要,因为你只使用一个帐户。 Google Drive API 并没有真正设计为像服务器一样使用。它旨在供希望在其每个用户帐户上存储信息的开发人员使用。就像你有一个图片应用一样,你可以拥有一个功能,将编辑后的图片存储在某人的个人 Google Drive 帐户中。

您(以及最近询问的许多其他人)想要做的实际上是使用云端硬盘帐户作为服务器。这意味着您获得refresh_token 的媒介不必与您使用云端硬盘帐户的媒介相关。

例如,在我的具体案例中,我想要一种方法来将用户图片免费存储在服务器上,以供 Android 应用使用。我正在使用名为 Parse 的免费服务充当我的数据库服务器,但它们在免费层中为您提供非常有限的文件存储。

因此,我决定尝试弄清楚如何使用 Google 云端硬盘帐户来扩展我的存储空间。我创建了一个通用 gmail 帐户,例如“hostingaccount@gmail.com”作为文件的主机(免费 15g)。

为了获得我的refresh_token,我设置了一个 php 服务器来验证那个帐户。当有人进入我设置的页面时,系统会提示他们登录,然后授予对我的项目的访问权限以使用他们的 Google Drive 帐户(具体范围:https://www.googleapis.com/auth/drive)。然后我设置脚本在屏幕上打印该帐户的 refresh_token。我复制了该字符串并将其放入我的服务器,现在我可以轻松地将 httpRequests 发送到:

https://www.googleapis.com/oauth2/v3/token/ 获取访问令牌并:

https://www.googleapis.com/upload/drive/v2/files 上传文件。

我在此编辑的顶部链接它,但this 答案向您展示了如何使用我的 php 方法获取刷新令牌。我从来没有花时间尝试弄清楚如何以任何其他方式获取刷新令牌,但如果您阅读我的整个长答案,我想我会提到我相信这也可以通过 Android Google Drive API 完成。

我已经尝试帮助很多人解决这个问题,也许我应该创建一个博客并制作一个关于它的教程;)

【讨论】:

  • 对于#4:好吧,如果可以的话,我会包含一个访问令牌。问题是要得到一个并不容易。据我了解,您首先必须提示用户登录他的谷歌帐户,然后您才能以某种方式获得令牌。但我不完全理解这是如何工作的。
  • 我做了一个很长的编辑,你应该看看。
  • 感谢您的回答卢克!我认为这可能对我有帮助(即使我仍然想知道如何获得第一个访问令牌)。几天后我会再试一次,尝试所有你说的,我会在这里给出反馈。注意:如果您不理解,我正在尝试通过简单的 http 请求来完成所有操作。不使用谷歌为其提供库的任何主要语言。我正在使用haskell。
  • 正如您在此处看到的developers.google.com/accounts/images/webflow.png 用户登录后我应该取回授权码。这是我的问题。我该怎么做?我必须听连接还是什么?没有线索。
  • 我认为您不能仅通过 http 对用户进行身份验证。您将不得不使用其他方法来获取refresh_token,然后您可以使用 http 请求来完成您想做的任何其他事情。您还需要确保您了解access_tokenrefresh_token 之间的区别,因为这是一个重要的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
相关资源
最近更新 更多