我想知道是否有人可以告诉我服务帐户向存储桶请求发送 POST 对象的正确语法和格式?我正在使用HttpComponents library 以编程方式尝试它。我设法从我的 GoogleCredential 中获取了一个令牌,但是每次我构建 POST 请求时,我都会得到:
HTTP/1.1 403 禁止
<?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message><Details
> 存储桶名称</Details></Error
>
描述请求方法的 Google文档提到了使用 html 表单发布,但我希望这并不是完成工作的唯一方法。我知道 HttpComponents 可以使用UrlEncodedFormEntity显式创建表单数据,但它不支持多部分数据。这就是我使用 MultipartEntity 类的原因。我的代码如下:
MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );
String token = credential.getAccessToken();
entity.addPart("Authorization", new StringBody("OAuth " + token));
String date = formatDate(new Date());
entity.addPart("Date", new StringBody(date));
entity.addPart("Content-Type", new StringBody("multipart/form-data"));
entity.addPart("bucket", new StringBody(bucket));
entity.addPart("key", new StringBody("fileName"));
entity.addPart("success_action_redirect", new StringBody("/storage"));
File uploadFile = new File("pathToFile");
FileBody fileBody = new FileBody(uploadFile, "text/xml");
entity.addPart("file", fileBody);
httppost.setEntity(entity);
System.out.println("Posting URI = "+httppost.toString());
HttpResponse response = client.execute(httppost);
HttpEntity resp_entity = response.getEntity();
正如我所提到的,我能够获得一个实际的令牌,所以我很确定问题在于我是如何形成请求的,而不是没有得到正确的身份验证。
记住:
- 这是由服务帐户执行的。
- 这意味着它确实具有读/写访问权限
感谢您的阅读,感谢您的帮助!