サービス アカウントが POST オブジェクトをバケット リクエストに送信するための適切な構文とフォーマットを教えてくれる人がいるかどうか疑問に思っています。HttpComponents ライブラリを使用してプログラムで試しています。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();
前述したように、私は実際のトークンを取得できたので、適切に認証されていないのではなく、リクエストをどのように作成したかに問題があると確信しています。
次の点に注意してください。
- これはサービス アカウントによって実行されています。
- つまり、読み取り/書き込みアクセス権があることを意味します
読んでくれてありがとう。助けてくれてありがとう!