2015-12-28 13 views
12

XML APIを使用してGoogle Cloud Storageにファイルをアップロードしようとしました。 GoogleAccessId、有効期限、署名がアップロードごとに生成されています。奇妙なことは、Postman(Chrome用アプリケーション)を使用してファイルをPUTできることです。そのURLは大丈夫です。私はちょうど私のAndroidのJavaプログラム(それは私に403エラーを返します)を使用してPUTすることはできません。アップロードを実行するソースコードは(:https://cloud.google.com/storage/docs/access-control#Signing-Stringsこの1にそれベース):ここでPUTオブジェクトのためのGoogle Cloud StorageへのHttpURLConnection PUTエラー403

URL url; 
    HttpURLConnection connection; 

    try { 
     url = new URL("http://google-testbucket.storage.googleapis.com/[email protected]unt.com&Expires=1331155464&Signature=BClz9e4UA2MRRDX62TPd8sNpUCxVsqUDG3YGPWvPcwN%2BmWBPqwgUYcOSszCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw%3D"); 
     connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("PUT"); 

     OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); 
     out.write("Test"); 
     out.close(); 

     Log.i("TAG", "PUT Response code: " + connection.getResponseCode()); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     Log.e("TAG", "MalformedURLException"); 
    } catch (ProtocolException e) { 
     e.printStackTrace(); 
     Log.e("TAG", "ProtocolException"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e("TAG", "IOException"); 
    } 

ドキュメント:https://cloud.google.com/storage/docs/xml-api/put-object-upload

は、誰もがこの問題に見て、私はこれで間違っていたかもしれないものをほのめかす与えることができます1?

+0

http://stackoverflow.com/questions/17225638/forbiddenerror-when-attempting-to-write-file-to-gcs-from-gae-python-appの重複している可能性があります。あなたのAndroidアプリが正しく認証されていない可能性がありますあなたはクロムであなたのGoogleアカウントにログインしていると仮定しています。 – morpheus05

+0

私はこれがポイントだとは思わない、なぜなら私は自分のアカウントからログアウトしても働くからです。根本的な根本原因は違いますが、アイディアが足りなくなります。 – SmiglowiecX

+0

署名されたURLを使って作業する場合、URLが正しく署名されない可能性があります。 – morpheus05

答えて

11

HttpURLConnectionは、application/x-www-form-urlencodedの値を持つContent-Typeヘッダーを単独で追加しています。私はアンドロイドエミュレータでHTTPスニファを使ってやっています。

この自動追加ヘッダーは、署名の不一致を引き起こしました。 Content-Type: application/x-www-form-urlencodedでリクエストを許可するようにサーバー側のコードを変更した後、適切な署名が生成されて正常に動作します。

@ morpheus05ありがとうございます。

0

このようにコンテンツの種類を設定してください。

connection.setRequestProperty( "Content-Type"、 "");

HttpsUrlConnectionが "Content-Type:application/x-www-form-urlencoded"というコンテンツタイプを自動的に生成するため、 が署名の不一致を引き起こします。

関連する問題