2010-09-09 6 views
11

Ho problemi con il download di file binario (file zip) nella mia app da internet. Devo utilizzare l'autenticazione di accesso di base per autorizzare l'accesso al file, ma la risposta del server è sempre HTTP/1.0 400 Richiesta errata.Problema con l'autenticazione di accesso di base nel file downloader

String authentication = this._login+":"+this._pass; 
String encoding = Base64.encodeToString(authentication.getBytes(), 0);    

String fileName = "data.zip"; 
URL url = new URL("http://10.0.2.2/androidapp/data.zip"); 

HttpURLConnection ucon = (HttpURLConnection) url.openConnection(); 

ucon.setRequestMethod("GET"); 
ucon.setDoOutput(true); 

ucon.setRequestProperty ("Authorization", "Basic " + encoding); 
ucon.connect(); 

/* 
* Define InputStreams to read from the URLConnection. 
*/ 
InputStream is = ucon.getInputStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 

/* 
* Read bytes to the Buffer until there is nothing more to read(-1). 
*/ 
ByteArrayBuffer bab = new ByteArrayBuffer(50); 
int current = 0; 
while ((current = bis.read()) != -1) { 
    bab.append((byte) current); 
} 

bis.close(); 

/* Convert the Bytes read to a String. */ 
FileOutputStream fos = this._context.openFileOutput(fileName, this._context.MODE_WORLD_READABLE); 
fos.write(bab.toByteArray()); 
fos.close(); 

Potrebbe essere causato da spazi bianchi nella password?

risposta

30

Potrei essere un po 'in ritardo ma mi sono imbattuto in un problema simile. Il problema sta nella riga seguente:

String encoding = Base64.encodeToString(authentication.getBytes(), 0); 

Se si modifica quella linea a guardare come questo dovrebbe funzionare:

String encoding = Base64.encodeToString(authentication.getBytes(), Base64.NO_WRAP); 

Per impostazione predefinita l'util Base64 Android aggiunge un carattere di nuova riga alla fine del la stringa codificata. Ciò invalida le intestazioni HTTP e causa la "Richiesta non valida".

Il flag Base64.NO_WRAP indica al programma di utilità di creare la stringa codificata senza il carattere di fine riga, mantenendo intatte le intestazioni HTTP.

+0

Questo è tutto! Ho risolto questo problema qualche tempo fa. – Kamil

+2

Ottima risposta, scoperto nel modo più difficile. Non ho potuto trovare da nessuna parte nei documenti sulla nuova linea. Sai dove si trova/perché è fatto? – sgarman

+0

Perché dovrebbero farlo? – Xample

Problemi correlati