2015-12-28 26 views
12

Ho provato a caricare un file su Google Cloud Storage utilizzando l'API XML. Ho il diritto GoogleAccessId, la data di scadenza e la firma generate per ogni caricamento. La cosa strana è che posso inserire il file utilizzando Postman (applicazione per Chrome), quindi sono sicuro che l'URL è ok. Non riesco a METTERLO usando il mio programma Android Java (mi restituisce l'errore 403). Il caricamento di codice sorgente di esecuzione è qui (base su questo: https://cloud.google.com/storage/docs/access-control#Signing-Strings):HttpURLConnection PUT a Google Cloud Storage con errore 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"); 
    } 

Documentazione per PUT Oggetto: https://cloud.google.com/storage/docs/xml-api/put-object-upload

Qualcuno può esaminare questo problema e darmi dei suggerimenti che cosa potrebbe andato storto con questo uno?

+0

Possibile duplicato di http://stackoverflow.com/questions/17225638/forbiddenerror-when-attempting-to-write-file-to-gcs-from-gae-python-app Molto probabilmente l'app Android non è autenticata correttamente e in chrome sei (presumo tu abbia effettuato l'accesso sul tuo account google in chrome) – morpheus05

+0

Non penso che questo sia un punto, visto che per Postman funziona anche quando sono disconnesso da uno dei miei account. Ci deve essere una diversa causa principale, ma ho esaurito le idee. – SmiglowiecX

+0

Se lavori con URL firmati, l'URL potrebbe essere firmato erroneamente, – morpheus05

risposta

11

Ho appena capito che HttpURLConnection aggiunge Content-Type intestazione con valore application/x-www-form-urlencoded da solo. L'ho fatto usando lo sniffer HTTP sul mio emulatore Android.

Questa intestazione con aggiunta automatica ha causato la mancata corrispondenza della firma. Dopo aver modificato il codice sul lato server per consentire le richieste con Content-Type: application/x-www-form-urlencoded, viene generata la firma corretta e funziona correttamente.

Grazie @ morpheus05 per il vostro impegno.

0

imposta il tuo tipo di contenuto in questo modo.

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

perché HttpsUrlConnection Genera automaticamente il tipo di contenuto come "Content-Type: application/x-www-form-urlencoded" ciò causerà la mancata corrispondenza della firma.

Problemi correlati