【发布时间】:2013-07-29 01:34:50
【问题描述】:
我正在使用谷歌存储 API 来保存和检索部署在 GAE 上的应用程序中的图像。我成功检索了图像,但在持久化时,我在详细信息中收到错误 400:
400 OK
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Required",
"reason" : "required"
}],
"message" : "Required"
}
基于this information 我想我可能不需要它,所以我尝试不使用它。当我添加 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"
}
我已按照以下步骤操作:
- 开启对 Google Cloud Service 的 JSON API 访问权限
- 创建了一个服务帐号
- 下载了p12文件
- 将 maven 配置为不对文件进行编码
- 配置 maven 以包含存储服务 api
- 使用服务帐户电子邮件地址作为服务帐户创建了一个 GoogleCredential,将 StorageScopes.DEVSTORAGE_FULL_CONTROL 添加到范围并链接到私钥文件 (p12)
- 使用上述凭据、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 版本。
【问题讨论】:
-
默认情况下,ACL 列表应设置为合理的默认值。如果您尝试完全省略 setAcl(),对您有用吗?
-
删除 setAcl() 产生相同的结果。
-
实际上,ObjectAccessControls doc 并没有说明将域设置为实体,只是组或用户,而域将被设置(如果可用),但 Object insert doc 中的示例显示域是在 ACL 中设置为实体。
标签: java google-app-engine google-cloud-storage service-accounts