【问题标题】:uploading fails to google cloud storage using rest API POST使用 REST API POST 上传到谷歌云存储失败
【发布时间】:2016-10-21 09:15:37
【问题描述】:

我试图弄清楚如何使用 rest API 将文件上传到谷歌云存储,我不想使用客户端库。

我阅读了文件,但对初学者没有帮助,

任何人都可以给我一步一步如何做到这一点?以及 URL/header/body 格式应该是什么样子,如果也可以给我一个非常有帮助的例子。

【问题讨论】:

    标签: google-api google-cloud-storage


    【解决方案1】:

    如果您不打算使用任何帮助程序库并且也是初学者,那么实现上传到 GCS 的最困难的部分可能是验证您自己。让我们暂时忽略它。

    将对象上传到 Google Cloud Storage 的最简单方法是对 storage.googleapis.com 进行 HTTPS 调用,如下所示:

    PUT /your-bucket-name/your-object.txt HTTP/1.1
    Authorization:  (YOUR ACCESS TOKEN GOES HERE)
    Content-Length: 20
    Content-Type: text/plain-or-whatever; charset=utf-8
    Host: storage.googleapis.com
    User-Agent: YourApplication/1.0
    
    This is a test file
    

    这会将类型为“text/plain-or-whatever”的名为“your-object.txt”的文件上传到存储桶“your-bucket-name”,内容为“这是一个测试文件。”

    如果您的存储桶允许匿名用户上传文件(您不应该这样做),那么只要不包括 Authorization 行就可以了。

    现在,由于您真的不想使用任何客户端库,而且大概包括 Google 的 OAuth 库,您将需要自己实现授权,所以让我给您一个概述。

    不过,首先,如果您想立即试用,请安装“gcloud”工具,使用“gcloud auth login”登录,然后使用gcloud auth print-access-token 打印访问令牌。然后使用授权标头Authorization: Bearer whatever.gcloudprintedout。这样您就可以快速启动并运行 GCS。但是令牌只会持续一个小时左右,所以你需要真正实现 OAuth。

    Google Cloud API 使用 OAuth 来处理他们的请求,这是一种强大但不简单的身份验证机制。关于 OAuth with Google 如何工作的大量文档:https://developers.google.com/identity/protocols/OAuth2

    还有更多关于授权 Google Cloud 请求的一般信息:https://cloud.google.com/docs/authentication

    如果您在 App Engine 或 GCE 等 Google Cloud 技术上运行应用程序,则身份验证会更容易一些,但我假设您是在自己的机器上运行它。我将进一步假设您希望您的应用程序拥有自己的身份,而不是简单地让您作为上传流程的一部分登录。对于这种情况,您需要一个服务帐户,该帐户将具有关联的私钥。

    服务帐号的基本流程是,您将创建一个 JWT 访问凭证请求,然后使用您的私钥对该请求进行加密签名,然后将该签名请求发送给 Google。它将返回一个令牌,稍后可能会将其传递给您的实际上传请求。您可以继续使用该令牌直到它过期,届时您将需要构建另一个 JWT 请求来请求另一个令牌。

    同样,客户端库完全为您处理整个过程。我正在描述完全由您自己实现所有内容的方法。

    【讨论】:

    • 感谢 Brandon 的详细回答,我完成了生成令牌的整个过程,我能够获得 JWT,但是当我将它作为断言变量添加到 myurl 时,它给了我一个 BAD 请求错误:
    • 错误:{ "error": "invalid_grant" "error_description": "Invalid JWT: Token 必须是短期的 token 并且在合理的时间范围内" "error_uri": "" }跨度>
    • 您的时钟可能有误,或者您要求的时间过多:stackoverflow.com/questions/30115933/…
    • 我对此进行了检查,但我的时钟是正确的,我在标题响应中看到的内容:
    • 内容类型:应用程序/json; charset=UTF-8 日期:格林威治标准时间 2016 年 10 月 21 日星期五 19:02:28 过期时间:格林威治标准时间 2016 年 10 月 21 日星期五 19:02:28
    【解决方案2】:

    您可以在此处找到相同的示例:

    https://stackoverflow.com/a/53955058/4345389

    我已经解释了如何使用 REST API 将文件上传到谷歌云存储。

    谢谢

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2014-08-03
      • 2017-05-06
      • 2019-01-24
      • 1970-01-01
      相关资源
      最近更新 更多