我正在使用谷歌存储 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"
}
我已按照以下步骤操作:
- 开启对谷歌云服务的 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 版本。