2

我正在使用谷歌存储 API 从部署在 GAE 上的应用程序中保存和检索图像。我成功检索了图像,但是在持久化时,我在详细信息中收到错误 400:

400 OK
{
    "code" : 400,
    "errors" : [ {
        "domain" : "global",
        "message" : "Required",
        "reason" : "required"
     }],
     "message" : "Required"
}

基于这些信息,我认为我可能不需要它,所以我尝试不使用它。当我添加 apppot URL 时,我正在与谷歌云存储进行通信,我得到了这个:

400 OK
{
    "code" : 400,
    "errors" : [ {
        "domain" : "global",
        "message" : "Required",
        "reason" : "required"
     }, {
        "domain" : "global",
        "message" : "Could not find domain \"mydomain.appspot.com\".",
        "reason" : "invalid"
     } ],
     "message" : "Required"
}

我已按照以下步骤操作:

  1. 开启对谷歌云服务的 JSON API 访问
  2. 创建了一个服务帐户
  3. 下载了p12文件
  4. 将 maven 配置为不对文件进行编码
  5. 配置 maven 以包含存储服务 api
  6. 使用服务帐户电子邮件地址作为服务帐户创建了一个 GoogleCredential,将 StorageScopes.DEVSTORAGE_FULL_CONTROL 添加到范围并链接到私钥文件 (p12)
  7. 使用上面的凭证、http 传输等实例化了一个 Storage 对象

我正在使用在 StorageObject 对象上设置的 ObjectAccessControl 对象列表,如下所示:

...
//email from the service account client id configuration in the google cloud console
myAclList.add(new ObjectAccessControl()
            .setEntity("user-" + settings.getEmail()).setRole("OWNER")); 
//confused about what domain I should use; tried none, 
myAclList.add(new ObjectAccessControl()
            .setEntity("domain-" + settings.getDomain())
            .setRole("READER"));
StorageObject objectMetadata = new StorageObject()
            .setName("blahblah")
            .setAcl(myAclList)
            .setContentDisposition("attachment");
Storage.Objects.Insert insertObject = storage.objects()
            .insert(settings.getBucket(), objectMetadata, mediaContent);
insertObject.execute();  //400 error happens here
...

我究竟应该为域发送什么?我可能错过了在控制台中配置的东西吗?我没主意了。

非常感谢您的任何建议!

编辑:我正在使用 google-api-services-storage jar 的 v1beta2-rev2-1.15.0-rc 版本。

4

1 回答 1

1

您看到“找不到域 \"mydomain.appspot.com\"”的原因。是“域-”前缀是指 Google Apps for Business 域中的所有帐户,而不是 appengine 域名。例如,如果您为您的公司 fakecompany.com 使用 Google Apps,并且您想为 fakecompany.com 下的所有帐户授予对存储桶的读取访问权限,则可以指定“domain-fakecompany.com”来引用所有此类帐户。

我猜 mydomain.appspot.com 是一个 appengine 域名,而不是一个 Google Apps for Business 域,这会导致这种错误。

更新:还有一个误解值得指出。服务帐户不一定有权将新对象插入到您拥有的存储桶中。确保它对存储桶具有明确的 WRITE 或更好的权限,或者,如果您使用的是默认存储桶 ACL,它至少是您项目的“编辑器”。

最后,确保您的存储桶名称和对象名称在插入对象时存在且不为空。这是一个非常容易遇到的问题,并且提供的错误消息并不总是很清楚。

于 2013-07-31T18:55:54.647 回答