2015-12-28 12 views
12

Ich habe versucht, eine Datei in Google Cloud Storage mit XML-API hochzuladen. Ich habe die richtige GoogleAccessId, Ablaufdatum und Signatur für jeden Upload generiert. Das seltsame Ding ist, dass ich Datei mit Postman (Anwendung für Chrome) PUT kann, so bin ich sicher, dass die URL in Ordnung ist. Ich kann es einfach nicht mit meinem Android-Java-Programm PUT (es kehrt zu mir 403 Fehler). Der Quellcode Durchführung Upload ist hier (es Basis auf diese: https://cloud.google.com/storage/docs/access-control#Signing-Strings):HttpURLConnection PUT zu Google Cloud Storage mit Fehler 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"); 
    } 

Dokumentation für PUT Objekt: https://cloud.google.com/storage/docs/xml-api/put-object-upload

jemand in dieses Problem suchen und geben Sie mir Hinweise, was man könnte mit diesem schief gelaufen ein?

+0

Mögliches Duplikat von http://stackoverflow.com/questions/17225638/forbiddenerror-when-attemputing-to-write-file-to-gcs-from-gae-python-app Wahrscheinlich ist Ihre Android App nicht richtig authentifiziert und in Chrome sind Sie (ich nehme an, Sie sind in Ihrem Google-Konto in Chrom angemeldet) – morpheus05

+0

Ich denke nicht, dass dies ein Punkt ist, da für Postman es auch funktioniert, wenn ich von einem meiner Konten abgemeldet bin. Es muss eine andere Ursache geben, aber mir sind die Ideen ausgegangen. – SmiglowiecX

+0

Wenn Sie mit signierten URLs arbeiten, könnte die URL falsch signiert sein, – morpheus05

Antwort

11

Ich dachte nur, dass HttpURLConnectionContent-Type Header mit dem Wert application/x-www-form-urlencoded selbst erstellt. Ich habe es mit HTTP-Sniffer auf meinem Android-Emulator getan.

Dieser automatisch hinzugefügte Header verursachte eine Signaturabweichung. Nachdem ich den Code auf der Serverseite geändert habe, um Anfragen mit Content-Type: application/x-www-form-urlencoded zu erlauben, erzeugt er die richtige Signatur und es funktioniert gut.

Vielen Dank @ Morpheus05 für Ihr Engagement.

0

stellen Sie bitte Ihren Inhaltstyp so ein.

connection.setRequestProperty ("Inhaltstyp", "");

weil HttpsUrlConnection automatisch Inhaltstyp wie "Content-Type: Anwendung/x-www-Form-urlencoded" generieren, dies wird dazu führen, Signatur nicht übereinstimmen.

Verwandte Themen